如果我知道左侧会失败但是如果左侧通过右侧将被实例化,我可以将一个尚未在“AND”运算符右侧实例化的object.property放置吗?
在下面的示例中,第一个if / else语句为上述问题设置了另一个if语句。虽然我已经测试过它没有显示错误,但我想知道幕后会发生什么,或者有更好的方法。(有很多if / else语句使用第一个if / else语句的结果。
if (_articleGuid.Equals(Guid.Empty))
{
isArticleGuid = false;
}
else
{
article = new Article(Guid.Empty, _articleGuid);
bodyText = article.Text;
articleDate = Convert.ToDateTime(article.DateActive);
isArticleGuid = true;
}
if(isArticleGuid && article.Author != null)
{
divAuthor.InnerText = article.Author;
}
答案 0 :(得分:5)
假设我理解正确,这是安全的。 article
变量需要明确赋值,但语言保证如果&&
运算符的LHS表达式求值为false,则不会计算RHS表达式 - 所以你不会去获得NullReferenceException
。
从C#3.0语言规范,第7.11节:
操作
x && y
对应于操作x & y
,但仅当y
不为假时才评估x
。
答案 1 :(得分:2)
是的,这很好,因为&&
运算符可以保证短路。
为了更安全,您可以检查该文章是否为null而不是/以及检查isArticleGuid。
答案 2 :(得分:2)
在C#中,逻辑和运算符&&
从左到右计算其参数并使用短路评估。这意味着如果第一个参数的计算结果为false
,那么第二个参数将永远不会被评估。
使用这个编程实践并不错 - 这是一种众所周知的习惯用语C语法(C,C ++,C#,D等)的许多语言常见的
答案 3 :(得分:0)
除此之外,对于Jon的回答,VB .Net还可以使用新的(和丑陋的,IMO)'AndAlso'和'OrElse'关键字进行短路评估。
If SomeRef IsNot Null AndAlso SomeRef.Property = 42 Then
...etc