添加元素到null(空)列表<财产

本文关键字:列表 财产 元素 null 添加 | 更新日期: 2023-09-27 18:12:04

我遇到一个问题。

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

她是一些代码剪辑:

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

[…]

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

[…]

添加元素到null(空)列表<财产

添加元素到null (empty) List属性

null和空列表是两件不同的事情:将元素添加到空列表中可以正常工作,但如果您的属性是null(因为所有引用类型的属性最初都是null),则需要首先用空列表初始化它。

您可以使用自动属性初始化器(参见Kędrzu的答案),或者您可以在构造函数中手动初始化列表:

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

(由于属性是在超类Maps中声明的,所以我将在那里进行初始化,而不是在子类Quadrangle中进行初始化)

在c# 6中要简单得多:

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

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

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

您需要在添加之前实例化列表:

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

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

class Maps
{
    protected virtual List<Ant> AllAntsAtMap { get; set; }
    public Maps()
    {
        AllAntsAtMap = new List<Ant>();
    }
}

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

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