Те из нас, кто работал в 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
его аргументы или нет. Кто-нибудь знает?