草庐IT

Immutability

全部标签

c# - 最佳实践列表/数组/ReadOnlyCollection 创建(和使用)

我的代码中到处都是集合——我想这不是什么不寻常的事情。但是,各种集合类型的使用既不明显也不简单。通常,我喜欢使用公开“最佳”API且句法干扰最少的类型。(请参阅Bestpracticewhenreturninganarrayofvalues、Usinglistarrays-Bestpractices了解类似问题)。有指南建议在API中使用什么类型,但这些在普通(非API)代码中是不切实际的。例如:newReadOnlyCollection>(newList>{Tuple.Create("abc",3),Tuple.Create("def",37)})List是一种非常常见的数据结构,但

c# - 我们可以从 C# 访问 F# 复制和更新功能吗?

例如在F#中我们可以定义typeMyRecord={X:int;Y:int;Z:int}letmyRecord1={X=1;Y=2;Z=3;}我可以更新它letmyRecord2={myRecord1withY=100;Z=2}这太棒了,记录自动实现IStructuralEquality无需额外努力这一事实让我希望在C#中实现这一点。然而,也许我可以在F#中定义我的记录,但仍然能够在C#中执行一些更新。我想象一个像这样的APIMyRecordmyRecord2=myRecord.CopyAndUpdate(p=>p.Y,10).CopyAndUpdate(p=>p.Z,2)有没有一种方

c# - C# 中的不可变和只读是什么意思?

不可更改不可变对象(immutable对象)的值是否正确?我有两个关于readonly的场景我想了解:如果我有一个集合并将其标记为readonly,会怎样,如下所示。我还能调用_items.Add吗?privatereadonlyICollection_items;还有以下变量,如果稍后我调用_metadata.Change,这将更改Metadata实例中一对成员变量的内部值._metadata仍然是不可变的吗?privatereadonlyMetadata_metadata;对于上面的两个变量,我完全理解我不能在初始化器和构造器之外直接给它们赋新值。 最佳

c# - 高效、不可变、可扩展的 .NET 集合

这个问题在这里已经有了答案:Immutablecollections?(10个答案)关闭9年前。在我看来,.NET极度缺乏安全、不可变的集合类型,尤其是BCL,但我也没有看到其他方面做过多少工作。是否有人对.NET的(最好)生产质量、快速、不可变的集合库有任何指示。快速列表类型是必不可少的。我还没有准备好切换到F#。*编辑:搜索者请注意,这很快就会被纳入BCL:.NETimmutablecollections

c# - 不变的还是不可变的?

好吧,据我所知,不可变类型本质上是线程安全的,或者我在很多地方都读过,我想我明白为什么会这样。如果实例的内部状态在创建对象后无法修改,那么对实例本身的并发访问似乎没有问题。因此,我可以创建以下List:classImmutableList:IEnumerable{readonlyListinnerList;publicImmutableList(IEnumerablecollection){this.innerList=newList(collection);}publicImmutableList(){this.innerList=newList();}publicImmutable

C# 不可变整数

在Java中,字符串是不可变的。如果我们有一个字符串并对其进行更改,我们将获得由同一变量引用的新字符串:Stringstr="abc";str+="def";//nowstrreferstoanotherpieceintheheapcontaining"abcdef"//while"abc"isstillsomewhereintheheapuntiltakenbyGCIt'sbeensaidint和double在C#中是不可变的。这是否意味着当我们拥有int并稍后更改它时,我们会得到同一个变量“指向”的新int?同样的事情,但有堆栈。inti=1;i+=1;//samething:in

c# - 为什么 System.Windows.Point 和 System.Windows.Vector 是可变的?

鉴于可变结构通常被认为是邪恶的(例如Whyaremutablestructs“evil”?),是否有潜在的好处可能促使.NET框架的设计者制作System.Windows.Point&System.Windows.Vector可变?我想了解这一点,以便我可以决定让我自己的类似结构可变(如果有的话)是否有意义。使Point和Vector可变的决定可能只是判断错误,但如果有充分的理由(例如,性能优势),我想了解它是什么。我知道我在Vector.Normalize()方法的实现上被绊倒了几次,因为令人惊讶的是(!),它没有返回一个新的Vector。它只是改变了电流矢量。我一直认为它应该是这样

c# - 如何使结构不可变?

在StackOverflow和互联网上,我发现保持结构不可变是一个很好的设计原则。不幸的是,我从未见过任何实际导致这些结构真正不可变的实现。假设一个结构内部没有任何引用类型,我该如何真正使结构不可变?也就是说,我如何防止其任何原始字段发生突变(可能通过编译时/运行时异常)?我写了一个简单的测试,试图使结构不可变,但即使使用System.ComponentModel.ImmutableObjectAttribute也不起作用:classProgram{staticvoidMain(string[]args){ImmutableStructimmStruct1=newImmutableSt

c# - .NET 枚举类型实际上是可变值类型吗?

仔细观察枚举类型的字段,我惊讶地发现保存枚举特定实例实际值的“支持”实例字段不是private,正如我所想的,但是public.它不是readonly任何一个。(IsPublic真,IsInitOnly假。)许多人认为.NET类型系统中的“可变”值类型是“邪恶的”,那么为什么枚举类型(例如从C#代码创建的)就是这样?现在,事实证明,C#编译器有某种魔法可以否认公共(public)实例字段的存在(但见下文),但在例如PowerShell你可以这样做:prompt>$d=[DayOfWeek]::Thursdayprompt>$dThursdayprompt>$d.value__=6pro

c# - 我如何确定一个类在 C# 中是否不可变?

如何确定C#中的类是否不可变? 最佳答案 有ImmutableObjectAttribute,但很少使用且支持不佳-当然也没有强制执行(您可以使用[ImmutableObject(true)]标记可变对象。据我所知,这唯一影响的是IDE处理属性的方式(即显示/不显示命名的属性选项)。实际上,您必须检查FieldInfo.IsInitOnly,但这仅适用于真正100%不可变的类型(假设没有反射滥用等);它无助于冰棒的不变性,也无助于在实践中不可变的事物,但在它们的实现中则无济于事;也就是说,它们不能公开可变,但理论上该对象支持它。这里