2011-12-19 11 views
5

Tengo varias variables que configuré antes de crear un objeto, quiero comprobar si alguna de esas variables está nula, si alguna variable muestra un error. ¿Hay alguna manera de incorporar esto en un ciclo foreach?comprobar variables nulas

Por ej.

Var Var1 = blah1; 
Var Var2 = blah2; 
Var Var3 = blah3; 
Var Var4 = blah4; 
Var Var5 = blah5; 

foreach(var above, if any is null) 
Errmessage 

Gracias de antemano

+0

'foreach' requiere que estén en un' IEnumerable'. Si desea específicamente 'foreach', tendrá que poner cada uno de ellos en una colección. –

+0

¿Está buscando verificar las variables ** ALL ** en la función local o solo un subconjunto? –

+0

@ p.campbell en realidad para ser precisos, foreach necesita un IEnumerable –

Respuesta

15

Yo, personalmente, tendría controles separados para cada variable. En "mensaje de error" para múltiples verificaciones de validación es una mala idea.

La razón principal de esto es que su "mensaje de error" probablemente sea ArgumentNullException, que debería proporcionar el nombre de parámetro correcto. Esto será diferente por variable. Incluso si utiliza una excepción personalizada, proporcionar información acerca de cuya variable se haya especificado incorrectamente merece la pena el esfuerzo adicional de codificación.

Dicho esto, si usted quiere hacer esto, puede utilizar:

var Var1 = blah1; 
var Var2 = blah2; 
var Var3 = blah3; 
var Var4 = blah4; 
var Var5 = blah5; 

if ((new object[] {Var1, Var2, Var3, Var4, Var5}).Any(v => v==null)) 
    throw new Exception("Your error here"); 
+0

Acepto, los controles separados son mejores. Si anoto todas las variables en una declaración If, ¿hay alguna forma de saber qué variable era nula? p.ej. if (var1! = null && var2! = null && var3! = null) – user793468

+0

@ user793468 No, no directamente. Es parte del problema aquí. Si solo está tratando de acortar el código, puede usar algo como CuttingEdge. Condiciones: http://conditions.codeplex.com/ Le permitirá escribir los cheques como una línea por variable y aún proporcionar excepciones relativamente significativas. –

3

ponerlos en una lista de object y el lazo sobre él:

List<object> list = new List<object>(); 
list.add(Var1); 
list.add(Var2); 
// etc. 

foreach(object obj in list) 
{ 
    if(obj == null) //message 
} 
4

ponerlos en un IEnumerable tales como una matriz

foreach(var v in new object[] { var1, var2, .... }){ 
if(v == null) { 
    Errmessage... 
} 
} 
0

Put todas esas variables en una lista. A continuación, puede recorrerlos como desee.

1

Mi primera inclinación sería no utilizar variables separadas pero en lugar de un diccionario:

var dict = new Dictionary<string, object>(); 

dict["var1"] = blah1; 
// etc. 

foreach(var value in dict.Values) 
{ 
    if(value == null) 
     throw new Exception(errorMessage); 
} 
1

Una forma sería la de realizar un seguimiento de ellos en una lista a un lado y a continuación, recorrer la lista:

List<object> objects = new ....; 

Var Var1 = blah1; objects.add(Var1)... 
Var Var2 = blah2; ... 
Var Var3 = blah3; ... 
Var Var4 = blah4; ... 
Var Var5 = blah5; ... 

foreach(var objRef, in objects) 
    if(objRef == null) 
     Errmessage; break ? 
1

Si el número de variables puede cambiar en el futuro y que no desee a la lista manualmente todos ellos a continuación, sugiero utilizar este:

using System.Reflection; 

class MyClass{ 
    var Var1; 
    var Var2; 
    ... 
    var infos = typeof(MyClass).GetFields(); 
    foreach(var info in infos) 
    { 
     if(info.GetValue(this)==null) ShowErrorMessage(info.Name); 
    } 
} 

nota: se puede reemplazar con GetFields GetMembers o GetProperties ...

0

con el fin de obtener el "si hay algún" semántica que está después, se podría crear una estática la clase de la siguiente manera (lo pongo en mi TypeExtensions espacio de nombres)

public static class NotAssigned { 
    public static bool AnyOf(params object[] Objects){ 
     foreach (var o in Objects) 
      if (o == null) 
       return true; 
     return false; 
    } 
} 

uso sería la siguiente

Var Var1 = blah1; 
Var Var2 = blah2; 
if (NotAssigned.AnyOf(blah1, blah2)) 
    throw new Exception 

Con unos pocos ajustes lógicos de menor importancia, se puede tirar en una función de AllOff, también tal vez un " Clase asignada ", con AnyOf y AllOf.

Hasta ahora solo he usado NotAssigned.AnyOf

0

Usted puede utilizar el operador params parámetro para pasar una lista de parámetros nulos:

public static void ThrowIfNull(params object[] input) 
    { 
     foreach (var item in input) 
     { 
      //Your choice of how you want to handle this. I chose an exception. 
      throw new NullReferenceException(); 
     } 
    } 

que le permitirá a:

int? nullableInt = null; 
    string someNullString = null; 

    ThrowIfNull(nullableInt, someNullString); 

También hay otras maneras de abordar este problema . Por ejemplo, puede crear un método de extensión para IEnumerable:

public static class NullExtensionMethods 
{ 
    public static void ThrowIfHasNull<T>(this IEnumerable collection) 
     where T : Exception, new() 
    { 
     foreach (var item in collection) 
     { 
      if (item == null) 
      { 
       throw new T(); 
      } 
     } 
    } 

    public static void ThrowIfHasNull(this IEnumerable collection) 
    { 
     ThrowIfHasNull<NullReferenceException>(collection); 
    } 
} 

hacer esto posible:

string someNullString = null; 
new string[] { someNullString }.ThrowIfHasNull(); 

//or for context specific exceptions 

new string[] { someNullString }.ThrowIfHasNull<ArgumentNullException>(); 

Aunque yo prefiero evitar excepciones siempre que sea posible. Se pueden realizar los siguientes cambios:

public static class NullExtensionMethods 
{ 
    public static bool HasNull(this IEnumerable collection) 
    { 
     foreach (var item in collection) 
     { 
      if (item == null) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

Lo que le permite manejar las cosas mucho más gracia:

var nullDetected = new string[] { someNullString }.HasNull(); 

Puesto que estamos utilizando métodos de extensión, que puede explotar aún más la función mediante la adición de sobrecargas para casos específicos. Entonces, por ejemplo, una cadena vacía se puede tratar de la misma manera String.IsNullOrEmpty. En este caso me gustaría añadir un método de extensión adicional HasNullOrEmpty:

public static bool HasNullOrEmpty(this IEnumerable<string> collection) 
    { 
     foreach (var item in collection) 
     { 
      if (string.IsNullOrEmpty(item)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

Aunque el comercio es que el tipo debe ser IEnumerable<string>

0

Ésta es mi manera, caja considerado y objeto unbox.

Aunque ref puede hacer más rendimiento, pero la codificación de pasar params es feo

Uso:

void Bala(Guid? id, int? type){ 
    if (NullableChecker.AnyIsNull(id, type)){ 
     //Do your stuff 
    } 
} 

La clase se puede utilizar T4 o herramientas similares para generar código

internal static class NullableChecker 
{ 
    public static bool AnyIsNull<T>(T? value) where T : struct 
    { 
     return false == value.HasValue; 
    } 

    public static bool AnyIsNull<T1, T2>(T1? value1, T2? value2) where T1 : struct where T2 : struct 
    { 
     return false == value1.HasValue || false == value2.HasValue; 
    } 

    public static bool AnyIsNull<T1, T2, T3>(T1? value1, T2? value2, T3? value3) where T1 : struct where T2 : struct where T3 : struct 
    { 
     return false == value1.HasValue || false == value2.HasValue || false == value3.HasValue; 
    } 

    public static bool AnyIsNull<T1, T2, T3, T4>(T1? value1, T2? value2, T3? value3, T4? value4) where T1 : struct where T2 : struct where T3 : struct where T4 : struct 
    { 
     return false == value1.HasValue || false == value2.HasValue || false == value3.HasValue || false == value4.HasValue; 
    } 
} 
Cuestiones relacionadas