¿El operador "If" de VB.NET causa boxeo?
Aquellos de nosotros que hemos trabajado en VB / VB.NET hemos visto un código similar a esta abominación:
Dim name As String = IIf(obj Is Nothing, "", obj.Name)
Digo "abominación" por tres simples razones:
IIf
es unfunción, todos cuyos parámetros son evaluados; por lo tanto siobj
no hay nada en la llamada anterior, entonces unaNullReferenceException
será arrojado Este es un comportamiento inesperado para alguien que está acostumbrado a los operadores ternarios en cortocircuito en lenguajes como C #.Porque IIf
es una función, por lo tanto incurre en la sobrecarga de una llamada de función. Una vez más, aunque esto no es un gran problema, simplemente no se siente bien para alguien que espera que se comporte como una operación ternaria intrínseca al lenguaje.IIf
no es genérico y, por lo tanto, acepta parámetros de tipoObject
, lo que significa los siguientes cuadros de llamada (creo) un total de tres enteros:
' boxes 2nd and 3rd arguments as well as return value '
Dim value As Integer = IIf(condition, 1, -1)
Ahora, en alguna versión más reciente de VB.NET (no estoy seguro de cuál es el número), elIf
se introdujo el operador, que funciona exactamente igual que elIIf
funcionan pero (según tengo entendido) sin las mismas deficiencias. Es decir, esohace proporcionar cortocircuito yes Una operación intrínseca de VB. Sin embargo, no estoy seguro de la última parte. losDocumentación de MSDN no parece indicar siIf
cajas de sus argumentos o no. ¿Alguien sabe?