tom*_*tom 14 c# readonly immutability
是否正确无法更改不可变对象的值?
我有两个关于readonly我想要理解的场景:
如果我有一个集合并将其标记为readonly,如下所示.我还能打电话_items.Add吗?
private readonly ICollection<MyItem> _items;
Run Code Online (Sandbox Code Playgroud)并且对于以下变量,如果稍后我调用_metadata.Change哪个将更改Metadata实例中的一个成员变量的内部值.是_metadata仍然不变?
private readonly Metadata _metadata;
Run Code Online (Sandbox Code Playgroud)对于上面的两个变量,我完全理解我不能在初始化器和构造器之外直接为它们分配新值.
NOt*_*Dev 23
我建议你阅读Eric Lippert撰写的一系列博客文章.第一部分是C#中的不变性:第一部分:不变性的种类.一如既往,非常翔实,乐于助人.该系列文章详细描述了变量是只读的,不可变的等等.
通常,readonly仅表示您无法在构造函数外重新分配字段.只要字段本身保持不变,就可以修改字段本身.所以,是的,您可以向存储在readonly字段中的集合添加元素.
关于可变性,这是更复杂的,它取决于你考虑什么样的可变性.当Metadata内部值是引用并且那些引用本身(它指向的实例)不会改变时,您可以说Metadata保持不变.但它在逻辑上是突变的.有关更多见解,请参阅Eric的帖子.
将字段标记为只读意味着您无法更改该字段的值.它与那里物体的内部状态无关.在您的示例中,虽然您无法将新的元数据对象分配给_metadata字段,也无法将新的ICollection分配给_items字段(在构造函数之外),您可以更改存储在的现有对象的内部值.那些领域.
一旦创建了一个不变的对象,就不能更改它。在C#中,字符串是不可变的。如果查看字符串操作例程,您会看到它们全部返回一个新的,经过修改的字符串,并使原始字符串保持不变。
这大大方便了字符串的处理。引用字符串时,可以确保没有其他人会意外更改它的脚部。
readonly还有其他的东西。这意味着引用一旦设置就无法更改,并且只能在对象构造期间进行设置。在示例中,您可以更改的内容_items或属性_metadata,但是不能将分配ICollection<MyItem>给_items成员或将分配Metadata给_metadata。
readonly在对对象的引用上设置。不变性是对象本身的属性。这些可以自由组合。为了确保不以任何方式更改属性,它应该是对不可变对象的只读引用。
没有什么可以阻止您改变存储在readonly字段中的对象。所以你可以在构造函数/初始化器之外调用_items.Add()and 。只会阻止您在构建后为这些字段分配新值。metadata._Change()readonly
| 归档时间: |
|
| 查看次数: |
10311 次 |
| 最近记录: |