对我来说,这是非常无法预测的结果。
我没想到这段代码会产生这样的结果。
因此,我读了杰弗里·里希特(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);
}
而且,正如某些人建议的那样,我们可以在控制台中看到四个名称。所以,我的问题是:
如果他们要分别进入“学生”和“ _students”中,但由于“学生”二传手的不存在而无法分配,我们如何获得他们的名字。
__________EDIT_1_________________
我阅读了您的答案,并感谢您的回答。
但是,您知道,这有点误会...我真的不明白。
当我初始化学生时,我会初始化_students吗?
什么不是那么重要了,当我把变量自IEnumerable(有些来自),我拿可变学生?我觉得不是。
我不明白,我到底在哪里分配变量(INITALIZE)_students集合?
谢谢您帮我弄清楚!
这些其他答案几乎是正确的。让我们仔细研究一下,然后使其真正好起来。
为什么集合初始值设定项只能与getter-only属性一起使用?
因为属性值未更改。该属性所引用的集合的内容就是已更改的内容。
将属性视为一个存储桶。您无法更改属性引用的存储桶,但是可以更改存储桶的内容。
如果他们要分别进入“学生”和“ _students”中,但由于“学生”二传手的不存在而无法分配,我们如何获得他们的名字。
根本不会分配“学生”属性。怎么会这样?它没有二传手。
这些名称将添加到Student getter所引用的集合中。
当我初始化学生时,我会初始化_students?
否。_students的初始化是为_students分配值的行。
集合初始值设定项将值添加到现有集合。变量_students已被初始化。
当我从IEnumerable(some)中获取变量时,我是从Student中获取变量吗?
您不会从任何东西中获取变量。你看重价值观。变量不是值;变量包含值。不要将存储与存储的值混淆。
我不明白,我到底在哪里分配变量(INITALIZE)_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
瞧,从来没有一个叫塞特的学生来。没有必要。它所做的只是获取_students中包含的引用,该引用已由字段初始化程序初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句