朋友们,我想知道为什么以下代码适用于List<int>
而不适用于List<string>
。当我在getter of property中初始化list时,它不起作用。如果我在构造函数中初始化它是有效的,如果我在调用类中创建列表它也可以。
public class MyClass
{
private List<int> _ints;
private static List<string> _strings;
public MyClass()
{
_ints = new List<int>();
}
public List<int> Ints
{
get
{
return _ints;
}
set
{
_ints = value;
}
}
public List<string> Strings
{
get
{
return _strings ?? new List<string>();
}
}
}
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
// This works
// mc.Ints = new List<int>();
// This works
mc.Ints.Add(1);
// This does not
mc.Strings.Add("Krishna");
}
}
答案 0 :(得分:4)
您没有在getter上初始化变量,如果变量为null,则创建一个新列表,但不存储对它的引用。
将您的代码更改为:
public List<string> Strings
{
get
{
if(_strings == null)
_strings = new List<string>();
return _strings;
}
}
答案 1 :(得分:1)
因为List<int>
在您的类的构造函数上初始化,而List<string>
没有。尝试:
public MyClass()
{
_ints = new List<int>();
_strings=new List<string>();
}
答案 2 :(得分:1)
此CREATE TABLE <table_name> as
(
column_name1 datatype(),
column_name2 datatype()
)
INSERT INTO <table_name>(column_name1, column_name2)
SELECT <column_names> FROM <table_name>;
无效,因为您每次致电mc.Strings.Add("Krishna");
时都会返回新的List<string>
。更详细地解释一下:
mc.Strings
简单地说,你做的就像你打电话一样:
MyClass mc = new MyClass(); // create new instance of MyClass and store it in the "mc" variable
mc // Direct call to the instance
.Strings // Direct call to MyClass Strings property
// inside Strings property :
// return _strings ?? new List<string>();
// meaning that if "_strings" member field is null
// return new instance of that property's type
.Add("abc"); // adds "abc" to the "forgotten" instance of List<string>
为了解决这个问题,你可以使用像这样的单线(你明显尝试过):
new List<string>().Add("abc");
或使用if语句:
return _strings ?? ( _strings = new List<string>() );
答案 3 :(得分:0)
你的&#39; _strings&#39; list始终为null。如果你打电话给&#39;得到&#39; &#39; Strings&#39;您始终创建并返回新的列表实例。
get
{
// if '_strings' is null, then create new instance of list
return _strings ?? new List<string>();
}
你需要使用它:
get
{
// If '_strings' is null, then create new instance of list and assign new instance to '_strings'
return _strings ?? (_strings = new List<string>());
}
答案 4 :(得分:0)
Gusman答案的内联变体,使用了C#6.0的一些不错的功能
public List<string> Strings => _strings ?? (_strings = new List<string>());
答案 5 :(得分:-1)
仅供参考,为了完全理解这个问题,你可以在这一行上设置一个断点:
return _strings ?? new List<string>();
您会看到_strings
始终为空,您需要将其初始化,因为上面的答案会告诉您:)