更简洁的方法来检查多个isValid语句

时间:2012-08-17 16:18:56

标签: c# .net extension-methods

我有很多方法可以执行验证 - tryParse是我使用的主要功能之一。

我最终得到这样的代码:

bool isValid = true;

int dealId;
isValid = !int.TryParse(strArr[0], out dealId) ? false : isValid;

DateTime createdOn;
isValid = !DateTime.TryParse(strArr[1], out createdOn) ? false : isValid;

isValid = !tmp.Add(new BookmarkedDeal(userId, dealId, createdOn)) ? false : isValid;

只有在结果为假的情况下才有更好的方法将isValid设置为false吗?

4 个答案:

答案 0 :(得分:2)

这取决于你对“更好”的定义,但你可以这样做:

int dealId;
DateTime createdOn;

return int.TryParse(strArr[0], out dealId) &&
       DateTime.TryParse(strArr[1], out createdOn) && 
       tmp.Add(new BookmarkedDeal(userId, dealId, createdOn))

(假设你当然是从一个方法返回这个,否则,你可以把它的值设置为bool isValid并像以前那样使用它)

&&称为条件AND运算符。基本思想是它只会进行足够的评估,以确定返回的值是否满足条件。首先,它将检查int.TryParse()是否返回true,如果是,则检查DateTime.TryParse(),然后检查以下方法是否返回true。这个运算符的优点是,如果有任何失败,那么它知道它不可能是真的并立即返回错误。

(还有一个条件OR运算符(||)以相同的方式运行,但是如果只计算得到公平,直到它达到true,从而使整个表达式为真。 / p>

答案 1 :(得分:1)

短路评估:

int dealId;
DateTime createdOn;

bool isValid = int.TryParse(strArr[0], out dealId)
               &&
               DateTime.TryParse(strArr[1], out createdOn)
               &&
               tmp.Add(new BookmarkedDeal(userId, dealId, createdOn));

(在上面的陈述中会发生短路,即一旦一个术语评估为假就停止评估)

此外,您可以订购验证,以便最有可能失败的事情首先......然后您可以通过不探索其他路径来更快地执行验证。 (过早优化的一个很好的例子......但如果每个术语可能需要一段时间才能执行,那么值得记住)。

=============================================== =================================

执行此操作的两种替代方法,即评估每个术语和记录isValid = false,如果任何评估为假。

使用逻辑AND(&&):

(将“&& isValid”放在表达式的右侧非常重要,以避免在前一个isValid为false时发生短路。)

int dealId;
DateTime createdOn;

bool isValid = int.TryParse(strArr[0], out dealId);
isValid = DateTime.TryParse(strArr[1], out createdOn) && isValid;
isValid = tmp.Add(new BookmarkedDeal(userId, dealId, createdOn)) && isValid;

使用按位AND(&):

int dealId;
DateTime createdOn;

bool isValid = int.TryParse(strArr[0], out dealId)
               &
               DateTime.TryParse(strArr[1], out createdOn)
               &
               tmp.Add(new BookmarkedDeal(userId, dealId, createdOn));

答案 2 :(得分:1)

这个怎么样:

int dealId;
DateTime createdOn;
bool isValid = int.TryParse(strArr[0], out dealId) && 
     DateTime.TryParse(strArr[1], out createdOn) && 
     tmp.Add(new BookmarkedDeal(userId, dealId, createdOn)

As&&从左到右执行,从先前调用中检索的变量将准备好进行下一次调用。

答案 3 :(得分:-1)

这是您可以采用的另一种方式。我不确定传递params的开销会给系统造成什么损失,所以为什么不抓住错误呢?

bool isValid;
try
{ 
   int dealID = int.Parse(strArr[0]);
   DateTime createdOn = DateTime.Parse(strArry[1]);
   tmp.Add(new BookmarkedDeal(userId, dealId, createdOn);
   isValid = true;
}
catch
{
   isValid = false;
}