2011-12-19 42 views
5

Tôi có nhiều biến mà tôi đã đặt trước khi tạo đối tượng, tôi muốn kiểm tra xem có biến nào trong số đó không, nếu biến nào sau đó hiển thị lỗi. Có cách nào để kết hợp điều này trong vòng lặp foreach không?kiểm tra các biến null

Ví dụ:

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

foreach(var above, if any is null) 
Errmessage 

Cảm ơn trước

+0

'foreach' yêu cầu chúng nằm trong một' IEnumerable'. Nếu bạn đặc biệt muốn 'foreach', bạn sẽ cần phải đưa mỗi người vào một bộ sưu tập. –

+0

Bạn đang tìm cách kiểm tra ** TẤT CẢ ** biến trong hàm cục bộ hay chỉ một tập con? –

+0

@ p.campbell thực sự là chính xác foreach cần một IEnumerable –

Trả lời

15

Tôi, cá nhân, sẽ có các kiểm tra riêng cho mỗi biến. Trên "thông báo lỗi" cho nhiều kiểm tra xác thực là một ý tưởng tồi.

Lý do chính cho điều này là "thông báo lỗi" của bạn có thể là một số ArgumentNullException, phải cung cấp tên thông số thích hợp. Điều này sẽ khác nhau cho mỗi biến. Ngay cả khi bạn sử dụng ngoại lệ tùy chỉnh, việc cung cấp thông tin về mà biến số được chỉ định không đúng là đáng giá thêm nỗ lực mã hóa.

Điều đó đang được nói, nếu bạn muốn làm điều này, bạn có thể sử dụng:

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

Tôi đồng ý, kiểm tra riêng biệt tốt hơn. Nếu tôi làm tổ tất cả các biến trong một câu lệnh If, có cách nào để biết biến nào là null không? ví dụ. if (var1! = null && var2! = null && var3! = null) – user793468

+0

@ user793468 Không, không trực tiếp. Đó là một phần của vấn đề ở đây. Nếu bạn chỉ muốn rút ngắn mã, bạn có thể sử dụng một cái gì đó như CuttingEdge.Conditions: http://conditions.codeplex.com/ Nó cho phép bạn viết các kiểm tra dưới dạng một dòng cho mỗi biến và vẫn cung cấp các ngoại lệ tương đối có ý nghĩa. –

3

Đặt chúng vào một danh sách các object và vòng qua nó:

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

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

Đặt chúng trong một IEnumerable như một mảng

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

Đặt tất cả các biến đó thành danh sách. Sau đó bạn có thể lặp lại chúng như bạn muốn.

1

nghiêng đầu tiên của tôi sẽ không sử dụng các biến riêng biệt nhưng thay vì một từ điển:

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

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

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

Một cách sẽ được để theo dõi chúng trong một danh sách sang một bên và sau đó lặp qua danh sách:

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

Nếu số lượng các biến của bạn có thể thay đổi trong tương lai và bạn không muốn tự liệt kê tất cả trong số họ sau đó tôi đề nghị sử dụng này:

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

lưu ý: bạn có thể thay getFields với GetMembers hoặc GetProperties ...

0

để có được "nếu có" ngữ nghĩa bạn là sau đó, bạn có thể tạo một tĩnh lớp như sau (tôi đặt nó trong không gian tên TypeExtensions của tôi)

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

Cách sử dụng sẽ như sau

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

Với một vài điều chỉnh Logic nhỏ, bạn có thể ném vào một chức năng AllOff, cũng có lẽ là một " Đã gán "class, with AnyOf và AllOf.

Cho đến giờ tôi chỉ sử dụng NotAssigned.AnyOf

0

Bạn có thể sử dụng toán tử params tham số để thông qua một danh sách các thông số null:

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

mà sẽ cho phép bạn:

int? nullableInt = null; 
    string someNullString = null; 

    ThrowIfNull(nullableInt, someNullString); 

Ngoài ra còn có nhiều cách khác mà bạn có thể tiếp cận vấn đề này . Ví dụ bạn có thể tạo một phương pháp mở rộng cho 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); 
    } 
} 

Làm điều này có thể:

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

//or for context specific exceptions 

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

Mặc dù tôi thích để tránh trường hợp ngoại lệ nếu có thể. Bạn có thể thực hiện những thay đổi sau:

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

     return false; 
    } 
} 

Cho phép bạn xử lý những thứ nhiều duyên dáng hơn:

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

Vì chúng ta đang sử dụng phương pháp mở rộng, chúng tôi có thể tiếp tục khai thác tính năng này bằng cách thêm quá tải đối với trường hợp cụ thể. Vì vậy, ví dụ một chuỗi rỗng có thể được xử lý theo cùng một cách String.IsNullOrEmpty. Trong trường hợp này tôi sẽ thêm một phương pháp mở rộng thêm HasNullOrEmpty:

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

     return false; 
    } 

Mặc dù việc buôn bán của là loại phải IEnumerable<string>

0

Đây là cách của tôi, coi hộp và đối tượng Unbox.

Mặc dù ref có thể làm cho hiệu suất hơn, nhưng mã hóa để vượt qua params là xấu xí

năng bảo mật bằng:

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

Lớp có thể sử dụng T4 hoặc các công cụ tương tự để tạo ra mã

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; 
    } 
} 
Các vấn đề liên quan