父/子关系类结构中的对象引用错误

时间:2011-04-28 09:09:38

标签: c#

我在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();

    }

当我执行页面时,对象引用未设置为对象的实例。错误消息。

7 个答案:

答案 0 :(得分:2)

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

PhoneList = new List<PhoneNumber>();

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

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

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

答案 1 :(得分:1)

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; }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

null是引用类型的默认值。因为你没有在使用之前初始化你的PhoneList,它仍然是null并且你得到这个例外

答案 4 :(得分:0)

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

答案 5 :(得分:0)

尝试

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

答案 6 :(得分:0)

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

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