2010-08-11 12 views
7

¿Cuáles son las mejores prácticas para las conversiones de tipo en C#?¿Cuáles son las mejores prácticas para la conversión de tipo seguro en C#?

int temp=System.ConvertToInt32(Request.QueryString["Id"]); 
    if (temp!=null) 
     { // logic goes here } 

Esta falla si Id alguna manera resulta ser 'abc'

por favor consejo el uso de los operadores ternarios y otras declaraciones de una sola línea, aparte de si else (como el uso de una sola línea de operadores ternarios). Además, ¿ustedes prefieren TryParse sobre Convert & por qué? Haga que sus compañeros de opinión.

+1

La temperatura nunca será nula en la cadena –

Respuesta

7

TryParse tiene la ventaja evidente que en el caso de fallo volverá falsa en lugar de lanzar una excepción.

El patrón estándar sería algo así como:

int value; 
if (int.TryParse(Request.QueryString["Id"], out value)) 
{ 
    // Use value 
} 
else 
{ 
    // Do whatever you want on failure 
} 

Ahora, también es importante tener en cuenta que se puede dar int.TryParse un IFormatProvider y una NumberStyles - por ejemplo, es muy posible que desee especificar CultureInfo.InvariantCulture como el IFormatProvider si realmente se supone que es una ID autogenerada (en lugar de una ingresada por un usuario).

Si usted quiere tener efectivamente "valores por defecto" se podría escribir un método de ayuda como esto:

public static int? NullableTryParseInt32(string text) 
{ 
    int value; 
    return int.TryParse(text, out value) ? value : (int?) null; 
} 

A continuación, puede utilizar este modo:

int value = NullableTryParseInt32(text) ?? 10; 

O simplemente puede escribir un método que toma un valor predeterminado, por supuesto :)

+0

Hola Jon, gracias por la respuesta. ¿Cómo harías esa declaración con un operador ternario? Además, ¿no se inicializa 'afuera' cada vez que evalúo, juego o no coincido? ¿No deberíamos evitar tryParse solo por eso? –

+0

@Popo: Sí, el parámetro 'out' se inicializa en ambos sentidos, pero ¿por qué evitarías' TryParse' por eso? He agregado otro par de opciones para simplificar esto en el caso en que un valor predeterminado tiene sentido, pero muy a menudo la primera forma es la que está de más. –

+0

Gracias Jon, ¿TryTrue solo devolvería verdadero/falso? ¿Puedo verificar excepciones en TryParse como lo hizo Sunrisas al usar Convert? –

0

utiliza el método TryParse de la clase int.

int temp; 
if (int.TryParse(Request.QueryString["Id"], out temp) 
    { // logic goes here } 

Si id no contiene un número, TryParse devolverá falso.

ACTUALIZACIÓN: Se ha cambiado para mostrar int.TryParse

+0

anterior, parece que no tiene un método tryparse para mí ... ¿Seguro que no tenía intención de escribir int.TryParse? – Chris

+0

¿No es la temperatura de una preocupación aquí? –

+0

Creo que quieres usar int.TryParse no hay string.TryParse, después de todo ¿por qué querrías analizar una cadena en una cadena ;-) –

1

Cuando se trata de resolver cualquier problema que tenga varias soluciones similares, también trato de encontrar el que exprese al lector del código de lo que estoy tratando de lograr la cleeret. En mi opinión, eso significa ir por el .TryParse en este caso particular.

Usando TryParse dice al lector que no se garantiza que la entrada es válida (si tuviera que haría uso de analizar su lugar) Y ya que usted esté tratando se analiza la entrada como un int puede ser que también dejar que la línea de lectura de código de sus intenciones

1

tienes dos maneras de hacerlo

int i; 
if (Int32.TryParse(Request.QueryString["Id"], out i)) 
{ 
} 

o que puede hacer:

try 
{ 
    Convert.ToInt32(Request.QueryString["Id"]); 
} 
catch (FormatException ex) 
{ 
    // The field Id it's not convertible 
} 
catch (Exception ex) 
{ 
    // It could throw also ArgumentException or OverflowException 
} 
+0

Hola, sinrisas, ¿cómo puedo detectar excepciones en tryParse? –

+0

Bueno, puedes ponerlo en una declaración de catch try. La única excepción que TryParse puede arrojar, hasta donde yo sé, es ArgumentException, pero en este caso supongo que siempre le pasarás una cadena, por lo que nunca obtendrás esa excepción. La idea detrás de TryParse no es utilizar una declaración try catch, ya que devuelve verdadero o falso dependiendo del éxito de la conversión –

1

usando TryParse sería la mejor opción. La excepción de captura del método de conversión es una operación costosa.Por supuesto, TryParse solo aceptará cadenas mientras Convert.ToInt32 tomará objetos y podrá realizar conversiones (unboxing, down-casting desde largo/doble) además de analizar.

1

para cubrir el aspecto operador ternario de esta pregunta:

Mi consejo sobre el uso de los operadores ternarios no es usarlos si usted no es ya tan familiarizado con el código en cuestión que se lea naturalmente a usted . La concisión hace que lo familiar sea más familiar y lo extraño, lo extraño.

Cuando haya comentado la conversación sobre TryParse aquí lo suficiente como para que ya no necesite pensar conscientemente, la conversión de if-else a?: No será trivial, será automática. Hasta entonces solo vas a aumentar tu propia confusión.

Cuando no estoy familiarizado con algo, dejo caer al principio el código de "hablar como un bebé", aprendo lo nuevo y luego lo integro con mi estilo normal más conciso.

+0

Gracias por el consejo Jon. –

Cuestiones relacionadas