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

Ответы на вопрос(2)

Ваш ответ на вопрос