0

我有下面的代码:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address address { get; set; }

    public Person GetFullName()
    {
        return new Person { };
    }
}

public class Address
{
    public int Name { get; set; }
}

我需要检查 Person 是否不为空以及它包含的地址。为此,以下代码有效:

 class Program
    {

        static void Main(string[] args)
        {

            Person person = new Person();
            person.FirstName="bla";
            if (person != null && person.address != null)
            {
                Console.WriteLine(person.address.Name);
            }


        }
    }

我的问题:

这段代码如何作为 person.Address 执行应该抛出 Null 异常?

if (person != null && person.address != null)
4

2 回答 2

3

你的代码很好

if (person != null && person.address != null)

person为 null 时起作用,因为 C# 一旦遇到评估为假的语句,就会终止表达式中语句的评估。

您的代码与以下代码相同:

if (person != null)
{
    if (person.address != null)
    {
        // do stuff
    }
}

其他语言(Ada)不一样。在那里,计算表达式的顺序不是由操作的“成本”决定或决定的。如果您想强制执行评估顺序,则必须使用and then(or or else) 构造:

if (person != null and then person.address != null)

它使代码更清晰,但这就是它所要做的一切。

于 2012-07-18T10:55:45.707 回答
1

检查无效性的正确方法是if(person != null). 如果你这样做if(!person.Equals(null))了,你会得到一个 NullReferenceException if person == null。这有点滑稽,因为避免这个例外是首要目标。

您的代码会执行,因为person != null只有 if 为 true 时它才会开始查看下一条语句 is person.address != null。如果第一个语句返回 false,则由于 && 运算符,它甚至不会查看下一个语句。

编辑:您可能还想知道它person.address.Name永远不会为空,因为这是一个整数。默认情况下,它的 value = 0 而不是 null。当然,这仅适用于类成员字段,因为本地方法级别的字段必须在使用前显式分配一个值。

于 2012-07-18T10:49:49.663 回答