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集合?
谢谢你帮我弄清楚!
这些其他答案几乎是正确的。让我们仔细看看并真正解决问题。
为什么集合初始值设定项与仅 getter 属性一起使用?
因为属性值没有改变。属性所引用的集合的内容是发生更改的内容。
将财产视为一个桶。您无法更改属性引用的存储桶,但可以更改存储桶的内容。
如果我们的名字要进入 Students 和 _students 中,那么我们如何获得我们的名字,因为不存在学生设置器而没有分配这些名字。
Students 属性根本没有被分配。怎么会这样?它没有设置器。
这些名称将添加到 Students getter 引用的集合中。
当我初始化学生时,我初始化 _students ?
不。 _students 的初始化是为 _students 赋值的行。
集合初始值设定项将值添加到现有集合。变量 _students 已经初始化。
当我从 IEnumerable(some) 获取变量时,我是从 Students 获取变量?
你不从任何东西中获取变量。你接受价值观。变量不是值;变量包含值。不要将存储与存储的值混淆。
我不明白,我到底在哪里分配变量(初始化)_students 集合?
_students 变量在初始化 _students 的行中初始化。集合的内容在包含内容的行中初始化。
也许按照发生的顺序列出所有发生的事情会有所帮助:
或者,在代码中,这相当于:
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 中包含的引用,该引用已经由字段初始值设定项初始化。