理解Has A关系实现C#

understanding Has A relationship implementation C#

我的观点是,aPerson.PhoneNumber.Number是一个字符串,所以应该取字符串类型的值。

同样,在代码中,aPerson.PhoneNumber = phoneNumber aPerson.PhoneNumberphoneNumber 都是 PersonPhoneNumber 类型的对象。

行之后实际发生了什么变化
aPerson.PhoneNumber.Number = "Test Phone";

成功了吗?

谁能告诉我为什么这两行在编译时显示错误?

class PersonPhoneNumber
{
    public string Number { get; set; }
}

class Person
{
    public string Name { get; set; }
    public PersonPhoneNumber PhoneNumber { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Person aPerson = new Person();
        aPerson.Name = "Test Name";

        aPerson.PhoneNumber.Number = "Test Phone";//Error: System.NullReferenceException : Object reference not set to an instance of an object.

        PersonPhoneNumber phoneNumber = new PersonPhoneNumber();

        aPerson.PhoneNumber.Number = "Test Phone";//Error: System.NullReferenceException : Object reference not set to an instance of an object.

        aPerson.PhoneNumber = phoneNumber;
        aPerson.PhoneNumber.Number = "Test Phone"; // This does not show any error

        Console.WriteLine(aPerson.Name);
        Console.WriteLine(aPerson.PhoneNumber.Number);
    }

首先,我认为您的意思不是编译期间的错误,而是运行时的错误。

您的问题是 aPerson.PhoneNumber 在前 2 次尝试设置 Number 属性 时为空。直到你设置 aPerson.PhoneNumber = phoneNumber 它才不再为空。所以错误很明显。

如果您希望 aPerson.PhoneNumber.Number = "Test Phone"; 像代码中所示那样工作,您必须先初始化 aPerson.PhoneNumber

这通常在 Person class:

的构造函数中完成
public class Person
{
    public Person()
    {
        this.PhoneNumber = new PersonPhoneNumber();
    }

    public string Name { get; set; }
    public PersonPhoneNumber PhoneNumber { get; set; }
}

免责声明:这只会解决您遇到的错误 - 通常这不是好的做法。