草庐IT

Immutability

全部标签

c# - 有没有一种简单的方法来制作类的不可变版本?

有没有一种简单的方法可以使实例不可变?举个例子,我有一个包含很多数据字段的类(只有数据,没有行为):classMyObject{//lotsoffieldspainfultoinitializeallatonce//sowemakefieldsmutable:publicStringTitle{get;set;}publicStringAuthor{get;set;}//...}创建示例:MyObjectCreationExample(StringsomeParameters){varobj=newMyObject{Title="foo"//lotsoffieldsinitializa

c# - VB.NET linq group by 匿名类型不能按预期工作

我正在研究LINQPad附带的一些linq示例。在“C#3.0inaNutshell”文件夹中的Chater9-Grouping下,有一个名为“GroupingbyMultipleKeys”的示例查询。它包含以下查询:fromninnew[]{"Tom","Dick","Harry","Mary","Jay"}.AsQueryable()groupnbynew{FirstLetter=n[0],Length=n.Length}我将字符串“Jon”添加到数组的末尾以获得实际分组,并得出以下结果:这正是我所期待的。然后,在LINQPad中,我转到同一查询的VB.NET版本:'Manuall

c# - CA2104 警告 : Is there any way to mark a class as `Immutable` to suppress it?

考虑下面的代码,它触发了CA2104:Donotdeclarereadonlymutablereferencetypes.publicclassTest{//ThisprovokesCA2104:"Donotdeclarereadonlymutablereferencetypes".protectedreadonlyImmutableClassImmutableMember;}publicclassImmutableClass{}有谁知道以一种可以抑制警告CA2104的方式将类标记为不可变的方法吗?我尝试用[ImmutableObject(true)]装饰MutableClass没有成

c# - 自动生成不可变类和匹配的构建器类

有哪些工具/库可以采用结构并自动生成不可变包装器以及用于增量构建新实例的“构建器”类?示例输入:structFoo{publicintapples;publicintoranges;publicFooClone(){return(Foo)base.MemberwiseClone();}}示例输出:publicclassImmutableFoo//couldprobablybeastruct{privateFoosnapshot;internalImmutableFoo(Foovalue){this.snapshot=value;}publicFooBuilderBuilder(){re

c# - 仅在构造函数中使用私有(private) setter 是否会使对象线程安全?

我知道我可以像这样创建一个不可变的(即线程安全的)对象:classCantChangeThis{privatereadonlyintvalue;publicCantChangeThis(intvalue){this.value=value;}publicintValue{get{returnthis.value;}}}但是,我通常会“作弊”并这样做:classCantChangeThis{publicCantChangeThis(intvalue){this.Value=value;}publicintValue{get;privateset;}}然后我想知道,“为什么这行得通?”它真

c# - 只读结构在数组中时是否应该是不可变的?

(注意:此示例代码需要C#7.2或更高版本,以及NugetSystem.Memory程序包。)假设我们有一个只读结构,如下所示:publicreadonlystructTest{publicTest(intvalue){Value=value;}publicintValue{get;}}现在让我们把它放到一个数组中:vararray=newTest[]{newTest(1)};Console.WriteLine(array[0].Value);//Prints1到目前为止一切顺利。您不能编写代码直接修改array[0].Value。现在假设我们这样做:array.AsSpan().As

c# - Dictionary 是否损坏或 GetHashCode() 应该仅基于不可变成员?

将对象添加到.NET时System.Collections.Generic.Dictionaryclass内部存储了key的hashcode,用于后面的比较。当hashcode在初始插入字典后发生变化时,它通常会变得“不可访问”,并且当存在检查(即使使用相同的引用)返回false时可能会让用户感到惊讶(下面的示例代码)。GetHashCode文档说:TheGetHashCodemethodforanobjectmustconsistentlyreturnthesamehashcodeaslongasthereisnomodificationtotheobjectstatethatdet

c# - 为什么 Font 是不可变的?

字体不可变让程序员和GC都感到苦恼,因为您每次都需要创建一个新实例。为什么Font是不可变的引用类型? 最佳答案 它简化了渲染系统的使用。如果框架允许Font可变,则需要检测变化,并定期修改其呈现方式。由于Font创建了一个本地资源,保持这个不可变可以防止系统担心必须在内部重复地重新创建句柄。此外,我不同意“程序员的苦恼”。通过使Font不可变,它使用户创建Font对象时发生的事情更加明显。如果你想要一个新的Font,你需要创建一个新的Font对象,这又会创建新的原生字体资源。使Font不可变可以更清楚地了解正在发生的事情-您不太可

c# - 当两者都是引用类型时,字符串与类

这是我上次面试的方式:问题:字符串存储在哪里?答案:堆,因为它是引用类型问题:请解释以下代码:staticvoidMain(string[]args){stringone="test";stringtwo=one;one=one+"string";Console.WriteLine("Oneis{0}",one);Console.WriteLine("Twois{0}",two);}答:画了如下两张图:(表示语句,stringtwo=one;(表示语句,one=one+"string";。在堆上创建一个新的字符串并赋值)问题:正确。为下面的代码片段绘制类似的图:classProgram

c# - 如何设计具有复杂初始化的不可变对象(immutable对象)

我正在学习DDD,并且遇到了“值对象”应该是不可变的声明。我知道这意味着对象状态在创建后不应更改。这对我来说是一种新的思维方式,但在很多情况下都是有道理的。好的,所以我开始创建不可变的值对象。我确保他们将整个状态作为构造函数的参数,我不添加属性setter,并确保不允许任何方法修改内容(仅返回新实例)。但现在我想创建这个包含8个不同数值的值对象。如果我创建一个具有8个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说-在传递数字时很容易出错。这不是好的设计。所以问题是:是否有任何其他方法可以使我的不可变对象(immutable对象)更好......,可以在C#中完成任何魔术来克