2013-07-20 77 views
0

我正在處理自定義驗證程序,如果電子郵件地址或用戶名未發生更改,則該驗證程序需要失敗。 本質上,如果其中一個字符串比較爲真那麼它將通過驗證。我知道我忽略了一些簡單的東西。以下是我迄今爲止:檢查兩個項目是否已更改

bool emailChanged = Domain.Validation.ItemsHaveChanged(txtEmailAddress.Text, emailAddress); 
bool userNameChanged = Domain.Validation.ItemsHaveChanged(txtUserName.Text, userName); 

// make sure at least the email or username has changed. 
if (!emailChanged || !userNameChanged) 
{ 
    args.IsValid = false; 
    cvAccountChange.ErrorMessage = "There haven't been any changes to the account."; 
} 

這裏是方法ItemsHaveChanged

public static bool ItemsHaveChanged(string param1, string param2) 
{ 
    return string.Compare(param1.Trim(), param2.Trim()) != 0; 
} 

回答

4

您正在尋找的logical AND operator (&&):

if (!emailChanged && !userNameChanged) 
{ 
    args.IsValid = false; 
    cvAccountChange.ErrorMessage = "There haven't been any changes to the account."; 
} 
+1

一個更好的辦法,看看這是推理當輸入是*有效*時。如果電子郵件已更改**或**用戶名已更改,則該輸入有效:「emailChanged ||」 userNameChanged'。因此,如果相反的話,輸入無效:'!(emailChanged || userNameChanged)'。然後,[De Morgan's law](http://en.wikipedia.org/wiki/De_Morgan%27s_laws)聲明這相當於'!emailChanged &&!userNameChanged'。因此,'&&'。 –

+0

Mattias,+1這個很好的解釋,並提及德摩根 –

1

就個人而言,我會避免的規模就很令人吃驚條件只是這樣做:

if (emailChanged || usernameChanged) { 
    // everything is fine 
    return; 
} 

// neither changed 
args.IsValid = false; 
... 

也就是說,假設您可以從方法提前返回。 (除此之外,您還可以永遠只提取剪斷成單獨的一個代碼。)

或者,你能避免早日迴歸和複雜的表達:

var emailUnchanged = !ItemsHaveChanged(...); 
var usernameUnchanged = !ItemsHaveChanged(...); 

if (emailUnchanged || usernameUnchanged) { 
    // neither changed 
    args.IsValid = false; 
    ... 
} 
+0

我傾向於同意你的想法去另一種方式是所有'行動'會發生在'else'部分,這似乎倒退 –

+1

@ JonHarding在7行長的方法中,我認爲根本不會損害可讀性,或者至少不會比解析帶有許多否定的布爾表達式更糟糕。我也非常喜歡在特殊情況下提早出海以避免[箭頭代碼](http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html)和「我無事可做」可以被認爲是一個。 – millimoose

+0

@JonHarding說你的評論讓我覺得有點橫向,我現在增加了另一種方式,它避免了早期返回,同時也通過將否定變成局部變量的名稱來更容易地解析條件。 – millimoose