繁体   English   中英

Object 父/子关系 class 结构中的参考错误

[英]Object refrence error in Parent / Child Relationship class structure

我在 c# 中有以下代码片段

public class Customer
{
    public Customer()
    {
        PhoneList = new List<PhoneNumber>();
    }
    public Customer(int id, string name)
    {
        this.CustomerID = id;
        this.CustomerName = name;
    }
    public int CustomerID { get; set; }
    public string CustomerName { get; set; }
    public List<PhoneNumber> PhoneList { get; set; }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class PhoneNumber
{
    public int ID { get; set; }
    public int Number { get; set; }
    public PhoneNumber()
    {
    }
    public PhoneNumber(int id, int number)
    {
        this.ID = id;
        this.Number = number;

    }
}

我在 UI 中使用这些类如下

protected void Page_Load(object sender, EventArgs e)
    {
        List<Customer> list = new List<Customer>();

        list.Add(new Customer(2, "John"));
        list.Add(new Customer(3, "Joe"));
        list.Add(new Customer(4, "Don"));
        **list[0].PhoneList.Add(new PhoneNumber(1, 1231213));//Object reference not set to an instance of an object.**
        list[0].PhoneList.Add(new PhoneNumber(1, 1231213));
        GridView1.DataSource = list;
        GridView1.DataBind();

    }

当我执行页面获取Object 引用未设置为 object 的实例时。 错误信息。

Customer的默认构造函数中创建Customer.PhoneList时,您不会在 id/name 构造函数中创建它。 要么添加

PhoneList = new List<PhoneNumber>();

到第二个构造函数,或使用this()语法链接构造函数:

public Customer(int id, string name) : this()
{
    this.CustomerID = id;
    this.CustomerName = name;
}

这将首先调用默认构造函数。

Customer中的每个构造函数都需要初始化PhoneList集合。 您正在调用采用IdName的构造函数覆盖,它不会初始化集合。 更改该构造函数,如下所示:

public class Customer
{
    public Customer()
    {
        PhoneList = new List<PhoneNumber>();
    }
    public Customer(int id, string name)
        : this()
    {
        this.CustomerID = id;
        this.CustomerName = name;
    }
    public int CustomerID { get; set; }
    public string CustomerName { get; set; }
    public List<PhoneNumber> PhoneList { get; set; }
}

您没有在Customer(int id, string name)构造函数中初始化 PhoneList,因此当您添加新客户时它是 null。

null 是引用类型的默认值。 因为您没有在使用之前初始化 PhoneList,所以它仍然是 null 并且您会收到此异常

您是否考虑过在构造函数中使用参数初始化 PhoneList 属性? ;)

尝试做

public Customer(int id, string name) : this()     
{         
  this.CustomerID = id;         
  this.CustomerName = name;     
}
public Customer(int id, string name)
    {
        PhoneList = new List<PhoneNumber>(); //this constructor is call
        this.CustomerID = id;
        this.CustomerName = name;
    }

您没有在代码中调用的其他构造函数中添加 PhoneList,因此它从未初始化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM