ejemplos - tryparse c# ejemplo
¿Por qué todas las sobrecargas de TryParse tienen un parámetro de salida? (4)
He descubierto que muchas veces no necesito el parámetro out del método TryParse, pero el problema es que necesariamente. Aquí mostraré un ejemplo cuando no sea necesario.
Quiero comprobar si una cadena es un entero, si es un entero, imprima "Un entero"; de lo contrario, imprima "No es un número entero". Así que aquí está el código:
string value = Console.ReadLine(); //Get a value from the user.
int num; //Why should I have it?? No need at all !
if (int.TryParse(value, out num))
{
Console.WriteLine("An integer");
}
else
{
Console.WriteLine("Not an integer");
}
Me pregunto por qué TryParse siempre devuelve un parámetro de salida. ¿Por qué no tiene la sobrecarga sin un parámetro de salida?
EDITAR: Todavía no recibí ninguna respuesta que realmente ayude a entender por qué todas las sobrecargas de TryParse tienen un parámetro.
¿Por qué TryParse tiene un parámetro de salida?
Por la sencilla razón de cómo se implementa TryParse.
La forma en que determinas si algo es analizable o no, es analizándolo. Si eres capaz de analizar algo, entonces es parsable. Si no puede analizarlo, entonces no es analizable.
Por lo tanto, para determinar si algo es analizable o no, si es analizable, ¡ya lo hemos analizado! Sería tonto deshacerse de este valor analizado (cualquiera que se pregunte si algo es analizable o no está interesado en el resultado analizado), por lo que se devuelve el valor analizado.
Tiene un parámetro de salida porque el valor analizado es un subproducto de una llamada TryParse de retorno verdadero.
La respuesta corta es: "Porque así es como se define el método". Quizás por casualidad alguien del equipo de lenguaje C # podría encontrar esta pregunta y proporcionar un razonamiento sobre por qué se tomaron las decisiones, pero eso no cambia mucho en este momento. C # es un lenguaje compilado estáticamente y las firmas de los métodos deben coincidir, por lo que es así.
(Imagínese si cambiaran esto y rompieran. .TryParse()
en todos los códigos base existentes. Eso sería ... malo).
Sin embargo, es posible que pueda evitar esto en su propio código. Algo tan simple como un método de extensión podría hacer el truco por ti:
public static bool IsInt(this string s)
{
int x = 0;
return int.TryParse(s, out x);
}
Luego, en tu código solo deberías llamar a ese método desde el valor de la cadena:
string value = Console.ReadLine();
if (value.IsInt())
Console.WriteLine("An integer");
else
Console.WriteLine("Not an integer");
Tiene el parámetro de out
porque la gran mayoría de las veces cuando las personas lo usan, quieren el int (o doble, o decimal, o fecha y hora, o lo que sea) analizado.
Si no desea / necesita el valor analizado, y se encuentra haciéndolo todo el tiempo, puede escribir su propio "contenedor" en .TryParse()
que solo toma la cadena.
En este ejemplo (y podrías hacerlo más genérico, estoy seguro) podrías hacer algo como
int myInt = -1;
if(int.TryParse("123"))
myInt = int.Parse("123");
Luego en tu código (en este caso) llamarías:
public static bool TryParseNoOutput(this string value)
{
int noNeed = 0;
return int.TryParse(value, out noNeed);
}
Edición: Como se ha señalado en los comentarios, traté de llamar "int.TryParseNoOutput" cuando lo había definido como una extensión en una cadena. La respuesta ha sido actualizada para reflejar eso.
TryParse
es una operación relativamente compleja para determinar la representación int
de una string
. Si hubiera una sobrecarga que solo devuelva un bool
, sería muy probable que muchos desarrolladores (inexpertos) sigan este patrón ineficiente:
string value = Console.ReadLine();
if(value.TryParseNoOutput()) Console.WriteLine("An Integer");
else Console.WriteLine("Not an integer."):