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

弗拉迪斯拉夫·赫罗米(Vladislav Hromyh)

对我来说,这是非常无法预测的结果。

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

因此,我读了杰弗里·里希特(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集合?

谢谢您帮我弄清楚!

埃里克·利珀特(Eric Lippert)

这些其他答案几乎是正确的。让我们仔细研究一下,然后使其真正好起来。

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

因为属性值未更改。该属性所引用的集合的内容就是已更改的内容。

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

如果他们要分别进入“学生”和“ _students”中,但由于“学生”二传手的不存在而无法分配,我们如何获得他们的名字。

根本不会分配“学生”属性。怎么会这样?它没有二传手。

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

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

否。_students的初始化是为_students分配值的行。

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

当我从IEnumerable(some)中获取变量时,我是从Student中获取变量吗?

您不会从任何东西中获取变量看重价值观变量不是值;变量包含值。不要将存储与存储的值混淆。

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

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

也许将有助于按照发生的顺序准确列出所有发生的事情:

  • 创建一个新的Classroom对象;_students字段为null;产生对该对象的引用。
  • 创建一个新的空列表;对列表的引用将复制到新创建的Classroom对象的_students字段中。
  • 将在对新Classroom对象的引用上调用Student getter。它返回_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在对象初始值设定项中允许而不使用“ new”的集合初始值设定项?

来自分类Dev

为什么允许我修改对象初始值设定项只读的属性?

来自分类Dev

为什么如果使用初始值设定项不正确?

来自分类Dev

自定义初始值设定项,为什么使用 Date() 而不是 dateCreated?

来自分类Dev

为什么使用“指定的初始值设定项”初始化C联合给出随机值?

来自分类Dev

为什么集合初始化程序不能与表达式主体属性一起使用?

来自分类Dev

为什么集合运算符只能与dict_key视图对象一起使用,而不能与等效的集合方法一起使用?

来自分类Dev

错误:访问char数组初始值设定项中的元素无法与char一起使用

来自分类Dev

从初始值设定项列表初始化向量时,为什么不使用移动构造(通过隐式构造函数)

来自分类Dev

带有初始值设定项的惰性属性

来自分类Dev

对象初始值设定项+属性初始值设定项(从C#到F#)

来自分类Dev

使用数组初始值设定项作为静态数组

来自分类Dev

在 Java 函数中使用数组初始值设定项

来自分类Dev

在对象初始值设定项中使用数组初始值设定项时为NRE

来自分类Dev

无法使用集合初始值设定项实现类型,因为它未实现“ System.Collections.IEnumerable”

来自分类Dev

了解初始值如何与继承和非继承属性一起使用

来自分类Dev

必需属性不能与<form>标签一起使用

来自分类Dev

为什么switch case语句不能与Enum的属性一起使用?

来自分类Dev

为什么属性观察器不能与类一起使用?

来自分类PHP

为什么symfony assert不能与Edit Page上的novalidation属性一起使用?

来自分类Dev

为什么CSS光标属性不能与自定义URL一起使用?

来自分类Dev

为什么“ng-attr-”不能与属性“multiple”一起使用?

来自分类Dev

Swift:不能在属性初始值设定项中使用实例成员“trialGame”;属性初始值设定项在 'self' 可用之前运行

来自分类Dev

不能在属性初始值设定项中使用实例成员“月”;属性初始值设定项在 'self' 可用之前运行

来自分类Dev

如何修复“无法在属性初始值设定项中使用实例成员‘textField_1’;属性初始值设定项在‘self’可用之前运行”?

来自分类Dev

何时将 getter 和 setter 与属性一起使用?

来自分类Dev

在C#构造函数初始值设定项中使用默认属性值

来自分类Java

为什么JDK动态代理只能与接口一起使用?

来自分类Dev

为什么 git diff 只能与选项 --cached 一起使用?

Related 相关文章

  1. 1

    为什么在对象初始值设定项中允许而不使用“ new”的集合初始值设定项?

  2. 2

    为什么允许我修改对象初始值设定项只读的属性?

  3. 3

    为什么如果使用初始值设定项不正确?

  4. 4

    自定义初始值设定项,为什么使用 Date() 而不是 dateCreated?

  5. 5

    为什么使用“指定的初始值设定项”初始化C联合给出随机值?

  6. 6

    为什么集合初始化程序不能与表达式主体属性一起使用?

  7. 7

    为什么集合运算符只能与dict_key视图对象一起使用,而不能与等效的集合方法一起使用?

  8. 8

    错误:访问char数组初始值设定项中的元素无法与char一起使用

  9. 9

    从初始值设定项列表初始化向量时,为什么不使用移动构造(通过隐式构造函数)

  10. 10

    带有初始值设定项的惰性属性

  11. 11

    对象初始值设定项+属性初始值设定项(从C#到F#)

  12. 12

    使用数组初始值设定项作为静态数组

  13. 13

    在 Java 函数中使用数组初始值设定项

  14. 14

    在对象初始值设定项中使用数组初始值设定项时为NRE

  15. 15

    无法使用集合初始值设定项实现类型,因为它未实现“ System.Collections.IEnumerable”

  16. 16

    了解初始值如何与继承和非继承属性一起使用

  17. 17

    必需属性不能与<form>标签一起使用

  18. 18

    为什么switch case语句不能与Enum的属性一起使用?

  19. 19

    为什么属性观察器不能与类一起使用?

  20. 20

    为什么symfony assert不能与Edit Page上的novalidation属性一起使用?

  21. 21

    为什么CSS光标属性不能与自定义URL一起使用?

  22. 22

    为什么“ng-attr-”不能与属性“multiple”一起使用?

  23. 23

    Swift:不能在属性初始值设定项中使用实例成员“trialGame”;属性初始值设定项在 'self' 可用之前运行

  24. 24

    不能在属性初始值设定项中使用实例成员“月”;属性初始值设定项在 'self' 可用之前运行

  25. 25

    如何修复“无法在属性初始值设定项中使用实例成员‘textField_1’;属性初始值设定项在‘self’可用之前运行”?

  26. 26

    何时将 getter 和 setter 与属性一起使用?

  27. 27

    在C#构造函数初始值设定项中使用默认属性值

  28. 28

    为什么JDK动态代理只能与接口一起使用?

  29. 29

    为什么 git diff 只能与选项 --cached 一起使用?

热门标签

归档