propiedad operator has c# nullable

operator - string null c#



Usar tipos anulables en C# (8)

Abrió Reflector. HasValue es una búsqueda en un indicador booleano que se establece cuando se cambia el valor. Entonces, en términos de ciclos, una búsqueda será más rápida que la comparación.

public Nullable(T value) { this.value = value; this.hasValue = true; } private bool hasValue; internal T value; public bool HasValue { get { return this.hasValue; } }

Solo estoy interesado en las opiniones de las personas. Al usar tipos anulables en C #, ¿cuál es la mejor manera de probar null ?:

bool isNull = (i == null);

o

bool isNull = !i.HasValue;

También cuando se asigna a un tipo no nulo es este:

long? i = 1; long j = (long)i;

mejor que:

long? i = 1; long j = i.Value;


Ambos son iguales, pero usaría la versión anterior en ambos, ya que es más común en el lenguaje: comparación con nulo y conversión a un tipo.


No he usado Nullable Types en la práctica, pero por el momento sugiero usar j.GetValueOrDefault (). La documentación sugiere que este último arrojaría una InvalidOperationException en caso de un valor nulo. Dependiendo de la implementación interna del operador explict cast por mucho tiempo, el primero también podría hacerlo. Me quedaría con GetValueOrDefault y trataría el caso nulo / predeterminado de manera apropiada.


Por lo general, tiendo a inclinarme hacia la primera opción en ambos escenarios, ya que es más ''primitivo'' orientado a orientado a objetos (que era realmente lo que estábamos buscando), pero realmente no importa tanto


Tiendo a usar el primero en ambos, porque como necesita ser respaldado más adelante en su ciclo de vida, estos parecen más fáciles de entender cuál es la intención del escritor original.


Yo siempre usaría el formulario (i == nulo). Expresa lo que estás haciendo.

WRT la segunda pregunta, creo que cualquier forma está bien. Sin embargo, siempre lo verifico primero con nulo y tomo las medidas adecuadas, tal vez envolviendo ese control y acción en un método de ayuda (a menudo solo establece un valor predeterminado).


Yo usaría esto:

long? i = 1; ...some code... long j = i ?? 0;

Eso significa que, si soy nulo , se asignará 0.


Use los formularios que el equipo C # implementó especialmente para usted. Si alguien objeta, dígales que Anders dijo que estaba bien.

Lo que estoy diciendo, con ligereza, es que se trabajó mucho en la integración de tipos anulables en c # para brindarle una buena experiencia de programación.

Tenga en cuenta que, en términos de rendimiento, ambos formularios compilan hasta la misma IL, es decir:

int? i = 1; bool isINull = i == null; int j = (int)i;

Termina así después de que el compilador de C # ha llegado a él:

int? i = 1; bool isINull = !i.HasValue; int j = i.Value;