草庐IT

immutability

全部标签

c# - 如果委托(delegate)是不可变的,为什么我可以做 x += y 这样的事情?

阅读C#InDepth,第2版,第2.1.2节关于合并和删除委托(delegate)。小节标题指出“委托(delegate)是不可变的”并且“关于它们的任何内容都不能更改”。不过,在下一段中,它讨论了使用像这样的结构x+=y;其中x和y是兼容委托(delegate)类型的变量。我不是刚刚更改了x吗?或者当我这样做时(即立即)处置x时,不变性部分是否处理? 最佳答案 这就像做:stringx="x";stringy="y";x+=y;字符串也是不可变的。上面的代码没有更改字符串objects-它将x设置为不同的值。您需要区分变量和对象

c# - 什么是 C# 的 "moSTLy complete"(im) 可变性方法?

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭5年前。Improvethisquestion尽管CLR中提供了一些支持,但由于不可变性并未完全融入C#到F#的程度,或者完全融入框架(BCL),那么C#的(不)可变性的相当完整的解决方案是什么?我的优先顺序是一个解决方案,由与以下内容兼容的一般模式/原则组成一个单一的开源库,几乎没有依赖性少量互补/兼容的开源库商业的东西那个涵盖了Lippert的各种immutability提供不错的性能(我知道这很模糊)支持序列化支持克隆/复制(深/浅/部分?)在

c# - 什么是 C# 的 "moSTLy complete"(im) 可变性方法?

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭5年前。Improvethisquestion尽管CLR中提供了一些支持,但由于不可变性并未完全融入C#到F#的程度,或者完全融入框架(BCL),那么C#的(不)可变性的相当完整的解决方案是什么?我的优先顺序是一个解决方案,由与以下内容兼容的一般模式/原则组成一个单一的开源库,几乎没有依赖性少量互补/兼容的开源库商业的东西那个涵盖了Lippert的各种immutability提供不错的性能(我知道这很模糊)支持序列化支持克隆/复制(深/浅/部分?)在

c# - 为什么不可变对象(immutable对象)是线程安全的?

classUnit{privatereadonlystringname;privatereadonlydoublescale;publicUnit(stringname,doublescale){this.name=name;this.scale=scale,}publicstringName{get{returnname;}}publicstringScale{get{returnscale;}}privatestaticUnitgram=newUnit("Gram",1.0);publicUnitGram{get{returngram;}}}多个线程可以访问Unit.Gram。为什

c# - 为什么不可变对象(immutable对象)是线程安全的?

classUnit{privatereadonlystringname;privatereadonlydoublescale;publicUnit(stringname,doublescale){this.name=name;this.scale=scale,}publicstringName{get{returnname;}}publicstringScale{get{returnscale;}}privatestaticUnitgram=newUnit("Gram",1.0);publicUnitGram{get{returngram;}}}多个线程可以访问Unit.Gram。为什

c# - 如何在 C# 中创建不可变对象(immutable对象)?

关于BestpracticesforC#patternvalidation的问题,投票最高的答案说:Itendtoperformallofmyvalidationintheconstructor.ThisisamustbecauseIalmostalwayscreateimmutableobjects.如何在C#中创建不可变对象(immutable对象)?您是否只使用readonly关键字?如果您想在EntityFramework生成的模型类的构造函数中进行验证,这将如何工作?会不会像下面这样?publicpartialreadonlyPerson{publicPerson()}

c# - 如何在 C# 中创建不可变对象(immutable对象)?

关于BestpracticesforC#patternvalidation的问题,投票最高的答案说:Itendtoperformallofmyvalidationintheconstructor.ThisisamustbecauseIalmostalwayscreateimmutableobjects.如何在C#中创建不可变对象(immutable对象)?您是否只使用readonly关键字?如果您想在EntityFramework生成的模型类的构造函数中进行验证,这将如何工作?会不会像下面这样?publicpartialreadonlyPerson{publicPerson()}

c# - 在 C# 中,为什么我不能在 foreach 循环中修改值类型实例的成员?

我知道值类型应该是不可变的,但这只是一个建议,不是规则,对吧?那么为什么我不能做这样的事情:structMyStruct{publicstringName{get;set;}}publicclassProgram{staticvoidMain(string[]args){MyStruct[]array=newMyStruct[]{newMyStruct{Name="1"},newMyStruct{Name="2"}};foreach(variteminarray){item.Name="3";}//for(inti=0;i代码中的foreach循环无法编译,而注释的for循环工作正常。

c# - 在 C# 中,为什么我不能在 foreach 循环中修改值类型实例的成员?

我知道值类型应该是不可变的,但这只是一个建议,不是规则,对吧?那么为什么我不能做这样的事情:structMyStruct{publicstringName{get;set;}}publicclassProgram{staticvoidMain(string[]args){MyStruct[]array=newMyStruct[]{newMyStruct{Name="1"},newMyStruct{Name="2"}};foreach(variteminarray){item.Name="3";}//for(inti=0;i代码中的foreach循环无法编译,而注释的for循环工作正常。

c# - 如何创建不可变类?

我正在努力创建一个不可变类。我已将所有属性标记为只读。我有一个类(class)项目列表。尽管如果属性是只读的,则可以修改列表。公开列表的IEnumerable使其不可变。我想知道要使类不可变必须遵循的基本规则是什么? 最佳答案 我认为你在正确的轨道上-所有注入(inject)类的信息都应该在构造函数中提供所有属性都应该只是getter如果一个集合(或数组)被传递给构造函数,它应该被复制以防止调用者以后修改它如果您要归还您的收藏,请归还副本或只读版本(例如,使用ArrayList.ReadOnly或类似的-您可以将其与前一点结合起来并