整理if语句 - 未实例化的对象可以在AND运算符中

时间:2010-02-24 10:16:08

标签: c# if-statement

如果我知道左侧会失败但是如果左侧通过右侧将被实例化,我可以将一个尚未在“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;                        
        }

4 个答案:

答案 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