money - string.format c# number
¿Cómo string.Format maneja valores nulos? (4)
En su primer ejemplo, está presionando Format(String, Object)
, que se ve así cuando se desmonta:
public static string Format(string format, object arg0)
{
return Format(null, format, new object[] { arg0 });
}
Tenga en cuenta el new object[]
alrededor de eso.
El segundo, aparentemente está presionando el uso de Format(string, object[])
, al menos ese es el que se invoca cuando realizo la misma prueba. Desmontado, que se ve así:
public static string Format(string format, params object[] args)
{
return Format(null, format, args);
}
Entonces todos estos se canalizan a Format(IFormatProvider, string, object[])
. Genial, veamos las primeras líneas allí:
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
...
}
... welp, ahí está tu problema, allí mismo! La primera invocación lo está envolviendo en una nueva matriz, por lo que no es nulo. Pasar nulo explícitamente no lo hace, debido a la instancia específica de Format()
que está llamando.
En el siguiente código a continuación, ¿por qué las dos string.Format
no se comportan de la misma manera? En el primero, no se lanza ninguna excepción, pero en el segundo se arroja una ArgumentNullException
.
static void Main(string[] args)
{
Exception e = null;
string msgOne = string.Format("An exception occurred: {0}", e);
string msgTwo = string.Format("Another exception occurred: {0}", null);
}
¿Podría alguien ayudarme a entender la diferencia entre los dos?
Estoy adivinando aquí, pero parece ser la diferencia de qué llamada sobrecargada está golpeando. String.Format
tiene múltiples sobrecargas, es justo sobre lo que estás golpeando.
En el primer ejemplo, tendría sentido que estés golpeando String.Format(string,object)
.
En el segundo ejemplo al proporcionar null
lo más probable es que esté String.Format(string,params object[])
que, según la documentación, generaría una ArgumentNullException
cuando:
el formato o args es nulo.
Si está ejecutando .NET4, intente utilizar parámetros con nombre:
String.Format("Another exception occured: {0}", arg0: null);
¿Por qué está golpeando la sobrecarga params object[]
? Probablemente porque null
no es un objeto, y la forma en que funciona params
es que puede pasar cada valor como un nuevo objeto en la llamada o pasarle una matriz de valores. Es decir, los siguientes son uno en el mismo :
String.Format("Hello, {0}! Today is {1}.", "World", "Sunny");
String.Format("Hello, {0}! Today is {1}.", new Object[]{ "World", "Sunny" })
Entonces, está traduciendo la llamada de su declaración a algo similar a:
String format = "Another exception occured: {0}";
Object[] args = null;
String.Format(format, args); // throw new ArgumentNullException();
Hay dos diferencias que siguen:
Aquí, se asigna el valor nulo.
Exception e = null; string msgOne = string.Format("An exception occurred: {0}", e);
Aquí, el valor nulo no se puede leer en formato de cadena, lo que significa tipo de error de conversión.
string msgTwo = string.Format("Another exception occurred: {0}", null);
Te doy un ejemplo simple: Aquí, no puedes leer el valor NULL como un formato de cadena.
string str = null.toString();
La primera llamada se resuelve como una llamada a Formato (objeto), mientras que la segunda se resuelve como una llamada a Formato (objeto []). Los parámetros nulos son manejados de manera diferente por estas diferentes sobrecargas.
La resolución de sobrecarga se describe here . La parte relevante es que para la segunda llamada a Formato, una sobrecarga de Formato (objeto params []) se expande a Formato (objeto []), que es preferible a Formato (objeto). El literal null es tanto un objeto [] como un objeto, pero el objeto [] es más específico, por lo que se elige.