Те из нас, кто работал в VB/VB.NET, видели код, похожий на эту мерзость:
Dim name As String = IIf(obj Is Nothing, "", obj.Name)
Я говорю "мерзость" по трем простым причинам:
-
IIf- функция, все параметры которой оцениваются; следовательно, еслиobjничего в этом вызове, то будет выбрано aNullReferenceException. Это неожиданное поведение для тех, кто привык к короткозамкнутым тернарным операторам на таких языках, как С#. - Потому что
IIf- это функция, поэтому накладные расходы на вызов функции. Опять же, хотя это не имеет большого значения, это просто не нравится, если кто-то ожидает, что он будет вести себя как тройная операция, присущая языку. -
IIfявляется неэквивалентным и поэтому принимает параметры типаObject, что означает следующие ящики вызовов (я считаю) всего три целых числа:' boxes 2nd and 3rd arguments as well as return value 'Dim value As Integer = IIf(condition, 1, -1)
Теперь, в более поздней версии VB.NET(я не уверен, что это за номер), был введен оператор If, который работает точно так же, как функция IIf, но (как я понять это) без таких же недостатков. Иными словами, выполняет короткое замыкание, а - внутренняя операция VB. Однако я не уверен в последней части. документация MSDN, похоже, не указывает, указывает ли If его аргументы или нет. Кто-нибудь знает?