关于C#:将元素添加到空list

Add element to null (empty) List<T> Property

本问题已经有最佳答案,请猛点这里访问。

我有个问题。

问题是我试图将一个对象添加到这个对象的列表中。这个列表是一个属性,没有错误,但是当我在此时运行它时失败了,因为:"NullReferenceException"。听起来很合理,因为列表的属性是"空",但是我不能声明属性,可以吗?

她的密码被剪掉了:

1
2
3
class Maps
{
    protected virtual List<Ant> AllAntsAtMap { get; set; }

[…]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Quadrangle : Maps
{
    protected override List<Ant> AllAntsAtMap { get; set; }

    public override void AddAntToMap(Ant ant)
    {
        AllAntsAtMap.Add(ant);  //Error here
    }
    public override void AddAntsToMap(List<Ant> ants)
    {
        foreach (Ant ant in ants)
        {
            AddAntToMap(ant);
        }
    }

[…]


在构造函数中初始化列表:

1
2
3
4
5
6
7
8
9
class Maps
{
    public Maps()
    {
        AllAntsAtMap = new List<Ant>();
    }

    ...
}

(由于属性是在超类映射中声明的,所以我将在那里进行初始化,而不是在子类四边形中进行初始化。)


在C 6中更简单:

1
protected List<Ant> AllAntsAtMap { get; set; } = new List<Ant>();


您应该在使用前初始化AllAntsAtMap。您可以使用构造函数:

1
2
3
4
public Quadrangle()
{
    AllAntsAtMap = new List<Ant>();
}

在构造函数中初始化列表。

1
2
3
4
5
6
7
8
9
10
class Maps
{
    protected virtual List<Ant> AllAntsAtMap { get; set; }

    public Maps()
    {
        AllAntsAtMap = new List<Ant>();
    }

}

您不需要重写Quadrangle中的list属性,除非您特别需要一个独立于基类的列表。如果在子类中确实有单独的列表,则需要在子类构造函数中初始化该列表。

如果基类不应该有list属性的实现,那么应该使它成为abstract,而不是virtual,并在实现该属性的子类中初始化它。


您需要先实例化列表,然后再添加:

1
this.AllAntsAtMap = new List<AllAntsAtMap>();