我的代码如下:
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执行。地址应该抛出Null Exception?
if (person != null && person.address != null)
答案 0 :(得分:3)
你的代码非常好
if (person != null && person.address != null)
在person
为空时起作用,因为C#在遇到计算结果为false的语句时终止对表达式中语句的求值。
您的代码与以下内容相同:
if (person != null)
{
if (person.address != null)
{
// do stuff
}
}
其他语言(Ada)不一样。在那里,表达式被评估的顺序要么不是由操作的“成本”确定或确定的。如果您想强制执行评估顺序,则必须使用and then
(或or else
)结构:
if (person != null and then person.address != null)
它使代码更清晰,但这就是它的全部内容。
答案 1 :(得分:1)
检查无效的正确方法是if(person != null)
。如果您执行if(!person.Equals(null))
,那么您将获得NullReferenceException if person == null
。这是一种滑稽的,因为首先避免这种例外是目标。
您的代码会执行,因为如果person != null
为真,则它会开始查看下一个person.address != null
语句。如果第一个语句返回false,它甚至不会查看下一个语句因为&&操作
编辑:您也可能想知道person.address.Name
永远不会为空,因为这是一个整数。默认情况下,它的值= 0而不是null。当然,这仅适用于类成员字段,因为必须在使用前为本地方法级字段显式赋值。