2011-12-19 27 views
5

Nesne oluşturmadan önce ayarladığım birden çok değişken var, bu değişkenlerden herhangi birinin null değerinin olup olmadığını kontrol etmek istiyorum. Bunu foreach döngüsüne dahil etmenin bir yolu var mı? Örneğin,Boş değerler olup olmadığını denetle

. peşin

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

foreach(var above, if any is null) 
Errmessage 

Teşekkür

+0

"foreach", "IEnumerable" içinde olmasını gerektirir. Özellikle foreach'ı istiyorsanız, bunların her birini bir koleksiyona eklemeniz gerekir. –

+0

Yerel işlevdeki ** ALL ** değişkenlerini veya yalnızca bir alt grubu kontrol etmek mi istiyorsunuz? –

+0

@ p.campbell aslında tam foreach olması gereken bir IEnumerable –

cevap

15

Şahsen, her değişken için ayrı ayrı kontroller yapıyorum. Birden çok doğrulama denetimi için "hata mesajı" kötü bir fikirdir.

Bunun temel nedeni, "hata iletinizin" büyük olasılıkla bir parametre adı vermesi gereken bir ArgumentNullException olması gerektiğidir. Bu değişken başına farklı olacaktır. Özel bir istisna kullanmış olsanız bile, değişkeninin hatalı bir şekilde belirtildiği hakkında bilgi sağlamanız, ekstra kodlama çabasına değecektir. senin değişken sayısı gelecekte değişebilir Eğer

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

Katılıyorum, ayrı kontroller daha iyi. Eğer tüm değişkenleri bir If deyiminde barındırıyorsam, hangi değişkenin null olduğunu bilmek için bir yol var mı? Örneğin. (var1! = null && var2! = null && var3! = null) – user793468

+0

@ user793468 Hayır, doğrudan değil. Buradaki problemin bir parçası. Kodu kısaltmaya çalışıyorsanız, CutEdge.Conditions: http://conditions.codeplex.com/ gibi bir şey kullanabilirsiniz. Kontrolleri değişken başına bir satır olarak yazmanıza izin verir ve yine de nispeten anlamlı istisnalar sağlar. –

3

üzerinde bir object listesine ve döngü içine koyun:

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

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

bir dizi

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

koyun olarak bir IEnumerable böyle koyun tüm bu değişkenler bir listeye. Daha sonra bunları istediğiniz gibi yapabilirsiniz.

1

Benim ilk eğim ayrı değişkenler kullanmamayı olurdu ama bunun yerine bir sözlük:

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

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

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

bir yolu daha sonra listeyi döngü tarafına bir listede izlemek ve olacaktır:

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

ve el sonra hepsini listelemek istemiyorum: Bunu isterseniz

söyleniyor, kullanabileceğiniz Bunu kullanmak öneririz:

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); 
    } 
} 

not: peşindesiniz semantik, yaratabileceğin "varsa" statik alabilmek için ... GetMembers veya GetProperties ile

0

GetFields yerini alabilir Aşağıdaki sınıf gibi "belki de bir de, bir AllOff fonksiyonunu atabilir, birkaç küçük mantık ayarlamayla

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

şöyle

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

Kullanımı olurdu (benim TypeExtensions ad koymak) Atanan "sınıfı, AnyOf ve AllOf ile.

Şimdiye kadar sadece NotAssigned'i kullandım.Anyof

0

Sen boş parametrelerin bir listesini geçmesine params parametre operatörünü kullanabilirsiniz:

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(); 
     } 
    } 

sağlayacak olan size:

int? nullableInt = null; 
    string someNullString = null; 

    ThrowIfNull(nullableInt, someNullString); 

bu sorunu yaklaşım başka yolları da vardır . Örneğin siz IEnumerable için bir uzantısı yöntemi oluşturabilirsiniz:

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); 
    } 
} 

bu mümkün yapma:

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

//or for context specific exceptions 

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

nerede mümkünse durumları önlemek için tercih rağmen. Eğer çok daha incelikle şeyler işlemek için izin

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

     return false; 
    } 
} 

: Aşağıdaki değişiklikleri yapabilirsiniz biz uzatma yöntemleri kullanılarak olduğundan

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

, daha ayrıntılı spesifik durumlar için aşırı yüklenmeleri ekleyerek özelliğini yararlanabilir. Yani örneğin boş bir dize String.IsNullOrEmpty aynı şekilde ele alınabilir. ticaret olsa tip IEnumerable<string>

0

olması gerektiğini

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

     return false; 
    } 

Bu benim yolum, kabul kutu ve Unbox nesnedir: Bu durumda ben ekstra bir uzantısı yöntemi HasNullOrEmpty eklersiniz.

rağmen ref daha performans yapmak, ancak params geçmesine kodlama

alanı iri çirkin olabilir:

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

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; 
    } 
} 
oluşturmak için T4 veya benzeri araçları kullanabilirsiniz

İlgili konular