propiedad operator has c# nullable

operator - string null c#



Nullable ToString() (5)

Creo que muchas personas tienen tales controles porque no es un comportamiento natural de un objeto que puede tener un valor nulo.

Veo construcciones en todas partes como:

int? myVar = null; string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

¿Por qué no usar simplemente?

string test = myVar.ToString();

¿No es exactamente lo mismo? Al menos Reflector dice que:

public override string ToString() { if (!this.HasValue) { return ""; } return this.value.ToString(); }

Entonces, ¿es correcto (la versión más corta) o me falta algo?


Estás bastante correcto. También en esta pregunta , se sugiere la solución anterior, mientras que nadie realmente nota que ToString() ya da la respuesta correcta.

Quizás el argumento para la solución más detallada es la legibilidad: cuando llamas a ToString() en algo que se supone que es null , usualmente esperas una NullReferenceException , aunque aquí no se lanza.


Lo sé, mucho después de que fuera relevante, pero ... sospecho que es porque para los tipos de nullable como int? el método .ToString () no le permite usar cadenas de formato. Consulte ¿Cómo puedo formatear un DateTime que se puede nulos con ToString ()? . Tal vez en el código original, había una cadena de formato en .ToString (), o tal vez el codificador olvidó que .ToString () sin la cadena de formato todavía estaba disponible en tipos anulables.


No, está en lo correcto, la versión más corta es la misma que otras personas en ese sentido. La otra construcción que suelo usar mucho en vez del ternario con nulables es el operador nulo coalescente. que también te protege de los nulos. Para ToString () no es necesario (como ha señalado), pero para los valores int predeterminados (por ejemplo) funciona muy bien, por ejemplo:

int page = currentPage ?? 1;

que le permite realizar todas las operaciones de enteros en la página w / o primera comprobación y llamada explícitamente nula para el valor en currentPage (donde currentPage es un int. tal vez pasado como un param)


puede ser solo para seguir el patrón? o ellos no conocen el back-end. tienes el código correcto es exactamente el mismo. incluso puedes hacer:

int? i = null; i.ToString(); //No NullReferenceException