2013-07-20 32 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