为什么集合初始值设定项与 getter-only 属性一起使用?

Vla*_*myh 5 c# clr properties getter-setter

对我来说,这是非常不可预测的代码结果。

没想到这段代码会产生这样的结果。

因此,我阅读了 Jeffrey Richter 的书(clr ia c#),并且有一个包含此代码的示例。

internal class ClassRoom
{
    private List<String> _students = new List<string>();
    public List<String> Students { get { return _students; } }
}

ClassRoom classRoom = new ClassRoom
{
    Students = {"Mike", "Johny", "Vlad", "Stas"}
};

foreach (var some in classRoom.Students)
{
    Console.WriteLine(some);
}
Run Code Online (Sandbox Code Playgroud)

而且,正如你们中的一些人所建议的,我们可以在控制台中看到四个名称。所以,我的问题是:

我们如何获得我们的名字,如果他们要分别在学生和 _students 中,由于不存在学生二传手而未分配。

__________编辑_1_______________

我阅读了您的回答,并感谢您的回答。

但是,你知道,这是一种误解……我真的想不通。

当我初始化学生时,我初始化_students

还有什么不那么重要,当我从 IEnumerable( some ) 中获取变量时,我从Students 中获取变量?我想不是。

我不明白,我到底在哪里分配变量(初始化)_students集合?

谢谢你帮我弄清楚!

Eri*_*ert 1

这些其他答案几乎是正确的。让我们仔细看看并真正解决问题。

为什么集合初始值设定项与仅 getter 属性一起使用?

因为属性值没有改变。属性所引用的集合的内容是发生更改的内容。

将财产视为一个桶。您无法更改属性引用的存储桶,但可以更改存储桶的内容。

如果我们的名字要进入 Students 和 _students 中,那么我们如何获得我们的名字,因为不存在学生设置器而没有分配这些名字。

Students 属性根本没有被分配。怎么会这样?它没有设置器。

这些名称将添加到 Students getter 引用的集合中。

当我初始化学生时,我初始化 _students ?

不。 _students 的初始化是为 _students 赋值的行。

集合初始值设定项将值添加到现有集合。变量 _students 已经初始化。

当我从 IEnumerable(some) 获取变量时,我是从 Students 获取变量?

你不从任何东西中获取变量。你接受价值观。变量不是值;变量包含值。不要将存储与存储的值混淆。

我不明白,我到底在哪里分配变量(初始化)_students 集合?

_students 变量在初始化 _students 的行中初始化。集合的内容在包含内容的行中初始化

也许按照发生的顺序列出所有发生的事情会有所帮助:

  • 创建一个新的 Classroom 对象;_students 字段为空;生成对该对象的引用。
  • 创建一个新的空列表;对列表的引用被复制到新创建的 Classroom 对象的 _students 字段中。
  • 在对新 Classroom 对象的引用上调用 Students getter。它返回 _students 的内容,这是对空列表的引用。
  • 四个项目被添加到该列表中
  • 对 Classroom 对象的引用被复制到classroom 变量中。

或者,在代码中,这相当于:

c = create a Classroom
c._students = null
l1 = create a List<string>
c._students = l1
l2 = c.Students -- which returns c._students
l2.Add("...")  -- four times
classRoom = c
Run Code Online (Sandbox Code Playgroud)

你看,从来没有一个学生传球手被叫到。没有必要。它所做的只是获取 _students 中包含的引用,该引用已经由字段初始值设定项初始化。