Одна из больших проблем компьютерных языков заключается в том, что они склонны поднимать руки вверх (образно говоря) и отказываться от малейшей проблемы при выполнении вашего кода. Теперь C # делает небольшой шаг к тому, чтобы стать чуть более снисходительным и более решительным при выполнении вашего кода.
Проблема, которую пытается решить новый оператор, — это то, что происходит, когда вы пытаетесь получить доступ к тому, чего не существует. Например, если вы напишете:
var result = object1.object2.object3;
тогда все хорошо, пока существует объект. Если, скажем, object2 этого не сделает, вы получите исключение NullReferenceException.
Создание исключения — это своего рода чрезмерная реакция, и единственный способ предотвратить исключение программист — это проверить каждую ссылку на объект по очереди, прежде чем использовать одно из его свойств. Проблема в том, что вы не можете запросить свойство для нулевого объекта.
Однако, если подумать, все, что нужно изменить, — это ссылка на свойство нулевого объекта, чтобы вернуть значение null.
Это что нового? оператор для.
Выражение
var result = object1? .object2? .object3;
не генерирует исключение, если object2 имеет значение null. Вместо этого он возвращает null, если какой-либо из объектов имеет значение null. Это означает, что вы можете проверить наличие каких-либо проблем с выражением, просто проверив, что результат равен нулю. Конечно, это не означает, что вы можете знать, какой объект вызвал проблему, но знание того, что последняя ссылка имеет значение null, часто бывает достаточно, чтобы определить, что должно произойти дальше.
Проще говоря, выражение:
объект? .property
возвращает null, если объект имеет значение null, и object.property, если объект является чем-либо еще.
Точно так же вы можете использовать?. аналогично с вызовом метода и индексацией.
объект? .method ();
всегда работает и так работает
объект? [индекс]
Новый оператор занял первое место в опросе пользователей Microsoft, набрав 3752 голоса, и об его успехе сообщается в блоге MSDN. где также сообщается, что оператор может перейти к Visual Basic, согласно менеджеру проекта C # Мэдсу Торгерсену.
Еще один красноречивый комментарий:
«Другим неотъемлемым следствием комментария Мэда является подтверждение следующей версии C #. Конечно, я думаю, что мы все знали, что будет еще одна версия C #, но мы не можем быть уверены, пока что-то не будет объявлено публично».
Учитывая, что внимание Андерса Хейлсберга сосредоточено на TypeScript, а Microsoft в целом уделяет повышенное внимание C ++ и JavaScript, любые новости о продвижении C # являются хорошими.
Оператор безопасной навигации — хорошая идея?
Пока он соответствует существующему языку, все должно быть в порядке. Как правило, языки слишком легко сдаются и генерируют ненужные исключения времени выполнения.
Языки, которые этого не делают, обычно считаются простыми в использовании и достаточно мощными для метапрограммирования. Возьмем, к примеру, PHP, не очень хороший язык, но обычно он будет разворачиваться и создавать какую-то веб-страницу для обслуживания пользователя даже в случае ошибки.
Ruby, с другой стороны, имеет средства для работы с отсутствующими методами, что упрощает расширение языка.
Однако JavaScript представляет собой странную смесь слов «продолжать работу» и «генерировать исключение». Если вы напишете:
var a; var b = a;
нет проблем и b не определено. Но, если вы испытываете удачу и напишете:
var c = a.prop;
и a не определено или равно нулю, тогда вы получите исключение времени выполнения. Если a — объект, у которого нет опоры, вы получите undefined для c, но если вы попытаетесь вызвать метод, которого нет, вы получите исключение времени выполнения. Это сбивает с толку, и было бы лучше, если бы все ссылки либо оценивались, либо возвращали null.
Отказ от исключения и выброс исключения должны быть последним средством, а не первым выбором.
Больше информации
Наконец, C # получает символ «?.», Который иногда называют оператором безопасной навигации.
Статьи по Теме
RyuJIT — компилятор JIT .NET нового поколения
Microsoft советует разработчикам C # изучать JavaScript !?
Команда Microsoft объясняет языковую стагнацию
Чтобы получать информацию о новых статьях на I Programmer, установите панель инструментов I Programmer, подпишитесь на RSS-канал, подпишитесь на нас в Twitter, Facebook, Google+ или Linkedin или подпишитесь на нашу еженедельную новостную рассылку.
Комментарии
Оставьте комментарий или просмотрите существующие комментарии с помощью Disqus
или отправьте свой комментарий по адресу: comments@i-programmer.info