2010-10-28 58 views
4

場景: 可以說我們必須檢查地址行。其中包括地址欄1,地址欄2,城鎮,國家,郵政編碼 如果輸入任何一個屬性,則所有其他字段都是強制性的。 如果沒有輸入,驗證不必觸發。避免多個如果在C#中 - 最佳實踐

爲了達到這個目的,我結束了兩行If語句。 Like

if(AddressLine1 != null || AddressLine2 != null || Town != null || Country != null) 
{ 
    if(AddressLine1 != null && AddressLine2 != null && Town != null && Country != null) == false 
    { 
      return false; 
    } 
} 

注意:我正在使用c#。有沒有我可以使用的任何語言結構。

回答

6

好了,空合併運算符可以與第一幫助:

if (AddressLine1 ?? AddressLine2 ?? Town ?? Country != null) 
{ 
    if (AddressLine1 == null || AddressLine2 == null || 
     Town == null || Country == null) 
    { 
     return false; 
    } 
    // Presumably there's more here 
} 

你可能想,雖然寫了一些輔助方法:

if (IsAnyNonNull(AddressLine1, AddressLine2, Town, Country)) 
{ 
    if (IsAnyNull(AddressLine1, AddressLine2, Town, Country)) 
    { 
     return false; 
    } 
} 

凡實用方法會是這樣的:

public static bool IsAnyNonNull(params object[] values) 
{ 
    return values.Any(x => x != null); 
} 

public static bool IsAnyNull(params object[] values) 
{ 
    return values.Any(x => x == null); 
} 

當然,你仍然有兩個if語句 - 但我TH無論如何,這基本上是必要的墨水。

+0

Jon,你能澄清一下,如果你應該使用'params object []'或'IEnumerable '作爲靜態方法的數據類型嗎? – Kane 2010-10-28 12:37:33

+0

@Kane:我已經使用了'params object []',這樣你就可以把它叫做'IsAnyNull(x,y,z等)'而不是明確地創建一個新的集合。 – 2010-10-28 12:57:56

6

如果使組中的字段的數組,那麼你可以做:

var fields = new object[] {AddressLine1, AddressLine2, Town, Country}; 
return fields.All(f => f == null) || fields.All(f => f != null); 
8
private bool IsAddressValid(params string[] addressParts) 
{ 
    return addressParts.Any(p => p != null) ? addressParts.All(p => p != null) : true; 
} 

被稱爲像這樣:

var addressValid = IsAddressValid(AddressLine1, AddressLine2, Town, County); 
0

定義是:

public static bool SameNullness(params object[] values) 
{ 
    int nullCount = 0; 
    foreach (var value in values) 
    { 
     if (value == null) nullCount++; 
    } 

    return nullCount == values.Length; 
} 

然後像這樣使用它:

SameNullness(AddressLine1, AddressLine2, Town, Country);