2008-11-03 14 views
9

Me interesan las opiniones de las personas. Al usar tipos anulables en C# ¿cuál es la mejor manera práctica para la prueba de nulo:Uso de tipos anulables en C#

bool isNull = (i == null); 

o

bool isNull = !i.HasValue; 

también cuando se asigna a un tipo no nulo es la siguiente:

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

mejor que:

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

Respuesta

12

Utilice 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, ambas formas de compilación a la misma IL, es decir:

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

termina como esto después de que el compilador de C# tiene a ella:

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

I wo uld siempre usa la forma (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).

0

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.

0

Normalmente 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

14

usaría esto:

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

Eso significa que, si i es nula , que serán asignados 0.

+1

también, si está buscando asignar el valor predeterminado para ese tipo de valor (que puede o no ser 0) puede usar long j = i ?? predeterminado (largo); –

+0

El problema que tengo con la forma trhat es que no todos los desarrolladores sabrán lo que está sucediendo inmediatamente. –

+0

Muy bueno, no había descubierto el ?? operador o "predeterminado" aún. –

4

No he usado Nullable Types en la práctica, pero en el segundo caso, sugeriría 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.

1

I tienden 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.

1

Reflector abierto. 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; 
    } 
} 
+0

¿Ha comprobado en qué se basa la comparación? Me sorprendería si el azúcar sintáctico terminara siendo algo más que una llamada a HasValue. – mackenir

Cuestiones relacionadas