c#列表属性

本文关键字:属性 列表 | 更新日期: 2023-09-27 18:04:00

我已经设置了一个列表作为属性。我想添加到这个列表从另一个类,但当我运行我的代码告诉我,我有空引用。然而,我可以从列表中阅读。只有当我添加到列表时才会显示错误。

我做错了什么?

房地产类

public List<string> ownedShips;
void Start()
{
    ownedShips = new List<string> ();
}
public List<string> Ships
{
    get {return ownedShips;}
    set {ownedShips = value;}
}

从另一个类添加到列表中:

    public int shipCost; 
public bool purchasedShip;
public string shipName = "test";
TESTPlayerAccount player;

// Use this for initialization
void Start () 
{
    player = new TESTPlayerAccount ();
    Debug.Log (player.Currency);
}

public void BuyShip()
{
    if(player.Currency >= shipCost)
    {
        player.Ships.Add(shipName);
    }

}

c#列表属性

我觉得你需要这样的东西

class TESTPlayerAccount 
{
    private List<string> ownedShips;
    public TESTPlayerAccount ()
    {
        ownedShips = new List<string>();    
    }
    public List<string> Ships
    {
        get {return ownedShips;}
    }
}

您需要初始化支持属性的字段:

public List<string> ownedShips = new List<string>();

如果'Player'类的契约保证在实例化时调用'Start',则不需要初始化后备字段。但是,即使是这种情况,这样做也是很好的防御实践。

您似乎正在使用名为Start的函数来代替constructors。如果必须在创建类实例时初始化某些东西,那么构造函数就是一种方法,因为它将被自动调用。

public class TESTPlayerAccount 
{
    private List<string> ownedShips;
    public TESTPlayerAccount()
    {
        ownedShips = new List<string> ();
    }
    public List<string> Ships
    {
        get {return ownedShips;}
        set {ownedShips = value;}
    }
}

注意,在Start()函数的位置添加了一个构造函数(public TESTPlayerAccount())。当将类实例化为

时,在对象实例化时自动调用构造函数:
TESTPlayerAccount player = new TESTPlayerAccount();

构造函数也可以有参数。考虑以下构造函数,除了已经存在的无参数构造函数(public TESTPlayerAccount())之外,还可以将其添加到TESTPlayerAccount:

public TESTPlayerAccount(string shipToAddAtStart)
{
    ownedShips = new List<string> ();
    this.Ships.Add("The best ship evor!");
}

对于这两个构造函数,您有不同的行为。

在无参数构造函数public TESTPlayerAccount()中,您的列表被初始化,仅此而已。

在第二个构造函数public TESTPlayerAccount(string shipToAddAtStart)中,您可以提供一个初始元素以添加到列表中。当然,您可能不需要第二个构造函数,只是把它扔到那里,以表明您可以为一个类拥有多个构造函数,这些构造函数接受不同的参数并执行不同的行为。

您需要初始化您的列表。如果您希望在调用new时使用集合,则应该在构造函数中执行此操作。c#也有自动属性,这意味着你只需要写:

Public List<string> MyList {get; set;}

理想情况下,您还希望将属性公开为接口。.net泛型集合给你:

IEnumerable<T>
ICollection<T>
IList<T>

在你的类中,你可以将这些接口实例化为List,但是暴露的类型更加灵活。

从评论来看,我假设你使用的是Unity。

如果为真,则Start()函数只对继承MonoBehaviour类的类调用。

对于不继承MonoBehaviour的自定义类,将Start()函数更改为默认构造函数,如下所示:

TESTPlayerAccount:

public List<string> ownedShips;
public TESTPlayerAccount()
{
    ownedShips = new List<string> ();
}
public List<string> Ships
{
    get {return ownedShips;}
    set {ownedShips = value;}
}