如何将List定义为struct的字段?
这样的事情:
public struct MyStruct
{
public decimal SomeDecimalValue;
public int SomeIntValue;
public List<string> SomeStringList = new List<string> // <<I Mean this one?
}
然后使用该字符串像这样:
Private void UseMyStruct()
{
MyStruct S= new MyStruct();
s.Add("first string");
s.Add("second string");
}
我尝试过一些东西,但它们都会返回错误而无法正常工作。
答案 0 :(得分:12)
您不能在结构中使用字段初始值设定项。
原因是字段初始值设定项实际上已编译到无参数构造函数中,但您不能在结构中使用无参数构造函数。
你不能拥有无参数构造函数的原因是结构的默认构造是用零字节擦除它的内存。
但是,你可以做的是:
public struct MyStruct
{
private List<string> someStringList;
public List<string> SomeStringList
{
get
{
if (this.someStringList == null)
{
this.someStringList = new List<string>();
}
return this.someStringList;
}
}
}
注意:这不是线程安全的,但可以根据需要进行修改。
答案 1 :(得分:1)
结构中的公共字段是邪恶的,当你不看时会刺伤你的后背!
也就是说,您可以在(parameterfull)构造函数中初始化它,如下所示:
public struct MyStruct
{
public decimal SomeDecimalValue;
public int SomeIntValue;
public List<string> SomeStringList;
public MyStruct(decimal myDecimal, int myInt)
{
SomeDecimalValue = myDecimal;
SomeIntValue = myInt;
SomeStringList = new List<string>();
}
public void Add(string value)
{
if (SomeStringList == null)
SomeStringList = new List<string>();
SomeStringList.Add(value);
}
}
请注意,如果有人使用默认构造函数,SomeStringList
仍将为null:
MyStruct s = new MyStruct(1, 2);
s.SomeStringList.Add("first string");
s.Add("second string");
MyStruct s1 = new MyStruct(); //SomeStringList is null
//s1.SomeStringList.Add("first string"); //blows up
s1.Add("second string");