2009-09-12 18 views
13

Después de leer en stackoverflow, en el caso de verificar el formato de un DateTime debe usar DateTime.TryParse. Después de probar algunas expresiones regex, parecen tener un aspecto largo y desagradable para cubrir gran parte del formato.¿Desea anular los parámetros en C#?

Pero TryParse requiere un parámetro de "salida" y como solo quiero hacer una comprobación de formato de validación, no necesito el resultado real.

Así que me queda una variable que contiene el resultado "fuera" y no voy a hacer nada con eso. ¿Hay alguna manera para que no tenga que hacer un parámetro de salida?

Así que me deshago de esta advertencia y dejo de tener una variable simplemente volando.

Respuesta

19

No. Me envuelvo en un método en alguna parte para mantener el ruido fuera de la corriente principal:

bool IsValidDate(string value) 
    { 
    DateTime result; 
    return DateTime.TryParse(value, out result); //result is stored, but you only care about the return value of TryParse() 
    } 
+6

me gustaría considerar la ampliación de la elipsis a los parametros reales en su respuesta – MPritchard

+0

@ Martin - gracias, sí, he considerado que, también, pero ya que no sabemos lo que chobo2 cadena de formato va a utilizar, Pensé que conocía los detalles mejor que yo. –

+0

Err, cree que "proveedor de formato", no "cadena de formato" –

4

No. Usted no puede deshacerse de la variable pero no se debería conseguir un compilador de aviso o.

Al pasar una variable como out está "usando" la variable. El compilador no emitirá una advertencia por eso.

+0

a la derecha, pensé que me estaba dando una idea de que fue lento para actualizar. – chobo2

3

Si está usando .NET 3 y superior, ¿siempre podría crear un método de extensión?

public static bool IsValidDate(this string value) 
{ 
    DateTime date = DateTime.Null; 
    return DateTime.TryParse(value, out date); 
} 

[Editado para cambiar el nombre del nombre de método a una más apropiada]

+2

No necesita inicializar una variable antes de pasarla como un argumento 'out'. Solo declararlo sería suficiente. –

+0

Es cierto. Es solo un hábito defensivo que tengo. –

+10

En realidad, en C#, este hábito "defensivo" es innecesario en el mejor de los casos y en realidad es malo o peor ya que el compilador impondrá la inicialización definitiva de la variable y no compilará si se usa antes de inicializarse. Si inicializas una variable cuando en realidad no es necesaria, y luego olvidas pasarla al método como un argumento 'out', la "actitud defensiva" hará que el error desaparezca silenciosamente. –

1

TryParse es una mejor opción. Es solo una variable que se desperdicia. Otras opciones incluyen usar el Convert.ToDateTime() dentro de un bloque try-catch. Pero una vez más, eso no sería eficiente porque los bloques try-catch son pesados. La siguiente opción es regex. Esta es una mejor solución. Supongo que esto te da el resultado al instante en comparación con los demás.

Puede muy bien envolver el método como Kim GrasMan dijo ...

+0

Ya, al final del día, realmente no es un gran problema que tenga en variable volando, pero realmente creo que debería poder usar null o algo así. O deberían tener solo un analizador que simplemente verifica y no devuelve nada. – chobo2

7

No estoy sugiriendo que realmente hacer esto, pero usted podría utilizar una sola clase de ayuda para hacer esto fácil para todos los parámetros de salida:

public static class OutHelper<T> 
{ 
    [ThreadStatic] 
    public static T Ignored; 
} 

A continuación, puede llamar a:

if (DateTime.TryParse(text, out OutHelper<DateTime>.Ignored)) 

Es horrible, utiliza un campo mutable público, y si su aplicación también se está ejecutando con algún código malicioso, le da a ese código acceso al último valor que ha analizado ... pero debería funcionar :)

+0

Esto hace que mis ojos sangren. La seguridad del hilo falla. –

+1

@Mehrdad: ¿De qué manera no es seguro para subprocesos? La idea es que nunca lea el valor, entonces, ¿a quién le importa si está escrito varias veces? Probablemente * causaría un error si el método que llamó escribió primero el parámetro de salida y luego lo leyó después ... pero de todas maneras eso suena como una mala idea. Obviamente sigue siendo una idea horrible en general :) –

+1

@Jon: me refería exactamente a la situación en la que el destinatario utiliza el parámetro 'out' como almacenamiento temporal que también contendrá el valor de retorno cuando finalice. Si bien esta es una mala idea para el destinatario asumir que no cambiará, es una expectativa natural. Usar una variable global para ese propósito rompe seriamente esta suposición. De todos modos, como mencionaste, es principalmente un tipo de "truco" y se debe evitar en la práctica. –

2

Con C# 7 (desde agosto de 2016) puede usar la construcción out var, y luego simplemente ignorar la nueva var en el código subsiguiente.

bool success = DateTime.TryParse(value, out var result); 
+0

Esta debería ser la respuesta más votada. 'resultado' sale fuera del alcance de inmediato. – fafrd

+0

Esto realmente mantendrá el 'resultado' para el código dentro del mismo alcance. Dentro de un método, puede verificar el éxito y tener el valor del resultado (o por defecto (DateTime)). Además, esta notación no era compatible antes de C# 7 – kskid19

Cuestiones relacionadas