Вызывает ли оператор VB.NET «если» бокс?
Те из нас, кто работал в VB / VB.NET, видели код, похожий на эту мерзость:
Dim name As String = IIf(obj Is Nothing, "", obj.Name)
Я говорю «мерзость» по трем простым причинам:
IIf
этофункциявсе параметры которого оцениваются; следовательно, еслиobj
ничего в приведенном выше вызове, тоNullReferenceException
будет брошен. Это неожиданное поведение для тех, кто привык к короткозамкнутым троичным операторам в таких языках, как C #.Так как 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
коробки свои аргументы или нет. Кто-нибудь знает?