7

我有这个简单的代码:

public static void Main(String[] args)
{
    Data data = new Data { List = { "1", "2", "3", "4" } };
    foreach (var str in data.List)
        Console.WriteLine(str);
    Console.ReadLine();
}

public class Data
{
    private List<String> _List = new List<String>();
    public List<String> List
    {
        get { return _List; }
    }
    public Data() { }
}

所以当我创建一个数据类时:

Data data = new Data { List = { "1", "2", "3", "4" } };

该列表充满了字符串“1”、“2”、“3”、“4”,即使它没有set.

为什么会这样?

4

2 回答 2

12

你的对象初始化器(带有集合初始化器List

Data data = new Data { List = { "1", "2", "3", "4" } };

变成以下内容:

var tmp = new Data();
tmp.List.Add("1");
tmp.List.Add("2");
tmp.List.Add("3");
tmp.List.Add("4");
Data data = tmp;

以这种方式看待它应该很清楚为什么您实际上是添加string1而不是添加string2tmp.List 返回 string1。您永远不会分配给属性,您只需初始化返回的集合。因此,您应该在这里查看 getter,而不是 setter。

但是,Tim 是绝对正确的,以这种方式定义的属性没有任何意义。这违反了最不意外的原则,并且对于该类的用户来说,那里的 setter 发生了什么并不明显。只是不要做这样的事情。

于 2015-10-09T12:08:09.047 回答
4

这就是集合初始化器在内部工作的方式:

Data data = new Data { List = { "1", "2", "3", "4" } };

基本上等于

Data _d = new Data();
_d.List.Add("1");
_d.List.Add("2");
_d.List.Add("3");
_d.List.Add("4");
Data data = _d;

_d.List用于string1吸气剂。

[*] C# 规范中的更多细节 $7.6.10.3 Collection initializers


将您的代码更改为:

Data data = new Data { List = new List<string>{ "1", "2", "3", "4" } };

并且string1将是空的,string2将有四个项目。

于 2015-10-09T12:08:46.567 回答