Veo en todas partes construcciones 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?
Respuestas:
Tienes toda la razón. También en esta pregunta , se sugiere la solución anterior, mientras que nadie se da cuenta de que
ToString()
ya da la respuesta correcta.Tal vez el argumento para la solución más detallada es la legibilidad: cuando recurres
ToString()
a algo que se supone que esnull
, generalmente esperas unNullReferenceException
, aunque aquí no se arroja.fuente
ToString()
funcionan sin queNullReferenceException
se lancen..HasValue
lanzar esa excepción.myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null
donde necesita el objeto sin abrir para acceder alToString
método deseado . Por supuesto, también hay una solución más concisa para eso:$"{myNullableDateTime:d}"
Creo que muchas personas tienen tales controles porque no es un comportamiento natural de un objeto que pueda tener un valor nulo.
fuente
No, tienes razón, la versión más corta es la misma que otras personas han hecho al respecto. El otro constructo que tiendo a usar mucho en lugar del ternario con valores nulos es el operador de fusión nula. que también te protege de los nulos. Para ToString () no es necesario (como señaló), pero para los valores int predeterminados (por ejemplo) funciona bien, por ejemplo:
que le permite hacer todas las operaciones de enteros en la página sin primero verificar explícitamente nulo y solicitar el valor en currentPage (¿dónde currentPage es un int? quizás pasado como un parámetro)
fuente
Lo sé, mucho después de que fuera relevante, pero ... sospecho que se debe a tipos anulables como int? El método .ToString () no le permite utilizar cadenas de formato. Consulte ¿Cómo puedo formatear un DateTime anulable con ToString ()? . Quizás 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.
fuente
puede ser solo para seguir el patrón? o no conocen el backend. tienes razón el código es exactamente el mismo. incluso puedes hacer:
fuente
int?
es el azúcar de sintaxis que simplifica la declaración de la variable anulable. Es lo mismo queNullable<int>
.Entonces, si echa un vistazo a la implementación del
ToString()
método paraNullable<T>
(ver más abajo) , puede notar que devuelve una cadena vacía en caso de que no tenga valor.Lo que dice MSDN:
Entonces, el siguiente código imprimirá una cadena vacía en la consola en lugar de lanzar una
ArgumentNullException
excepción.fuente