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);
}
}
我觉得你需要这样的东西
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;}
}