0

我有许多执行验证的方法——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

4 回答 4

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

(当然假设您是从方法中返回 this,否则,您可以将 this 的值设置为 abool isValid并像以前一样使用它)

&&称为条件与运算符。基本思想是它只会评估足够远以查看返回值是否满足条件。因此,首先它会检查是否int.TryParse()返回 true,如果返回 true,它将检查DateTime.TryParse(),然后如果返回 true,则执行以下方法。这个运算符的美妙之处在于,如果有任何失败,那么它知道它不可能为真并立即返回一个假。

(还有一个条件或运算符 ( ||) 的作用相同,但 if 的计算结果仅足够公平,直到它达到 a true,因此使整个表达式为真)。

于 2012-08-17T16:25:50.140 回答
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 如果任何评估为假。

使用逻辑与 (&&):

(将“&& 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;

使用按位与 (&):

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));
于 2012-08-17T16:25:51.707 回答
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)

由于 && 是从左到右执行的,从前一次调用中检索到的变量将为下一次调用做好准备。

于 2012-08-17T16:27:10.803 回答
-1

这是您可以接近的另一种方法。我不确定传递参数的开销会给系统带来什么开销,那么如果它出错,为什么不直接捕获它呢?

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;
}
于 2012-08-17T16:42:51.930 回答