Tag: 不变性

.Net中不可变类型的示例

我们知道不变性的概念,但除了需要知道几个不可变类型 串 约会时间 还有更多吗?

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

阅读C#深度,第2版 ,第2.1.2节关于组合和删除代表。 小节标题指出“代表是不可改变的”,并且“关于它们的任何内容都不能改变”。 但是,在下一段中,它讨论了使用类似的结构 x += y; 其中x和y是兼容委托类型的变量。 我不是刚刚换x吗? 或者,当我这样做时(即,立即)处理x时,不变性部分是否处理?

使用接口分离读写问题的最佳方法?

最近我一直在意识到(一些人会过度使用)不可变对象的好处,以大大减少我的对象模型中的读写依赖性问题及其产生的条件和副作用,最终使代码更易于管理(一种function性编程式的。 这种做法使我创建了只读对象,这些对象在创建/构建时提供了值,然后只为外部调用者提供公共getter来访问属性。 受保护的内部和私有设置器允许在写入对象模型时保持内部控制。 在通过我的对象模型创建API时创建接口时,我已经开始考虑有关不变性的相同问题。 例如,通过在我的接口上仅提供公共getter,并将其留给实现者来决定setter以及如何处理该方面。 我正在讨论的用于实现的“只读”接口的一个例子是这个有价值的项目(仅用于演示): public interface IValuableItem { decimal Amount {get;} string Currency {get;} } 但是我想知道我应该如何提供一个允许写入的伴随接口(如果我应该) ,而不是在同一个接口中组合这些操作,以免“污染”它的不变性。 我想到了以下几个想法,就在我的脑海中。 如果没有提供我认为对每个人的利弊, 你认为最好的方法是什么? 有没有一种行业中常用的编码方法来管理这个概念? // companion writer public interface IValuableModifier { decimal Amount {set;} string Currency {set;} } 要么 // explicit methods to enforce importance of or deviance in the programming public interface IValuableModifier { void […]

如何设计具有复杂初始化的不可变对象

我正在学习DDD,并且遇到了“值对象”应该是不可变的声明。 我理解这意味着对象状态在创建后不应该更改。 这对我来说是一种新的思维方式,但在许多情况下它是有道理的。 好的,所以我开始创建不可变的值对象。 我确保他们将整个状态作为构造函数的参数, 我不添加属性设置器, 并确保不允许任何方法修改内容(仅返回新实例)。 但现在我想创建这个包含8个不同数值的值对象。 如果我创建一个具有8个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说 – 传递数字时很容易出错。 这不是一个好的设计。 所以问题是:是否还有其他方法可以使我的不可变对象变得更好..,在C#中可以用来克服构造函数中的长参数列表的任何魔法? 我很想听听你的想法.. 更新:在任何人提到它之前,这里讨论了一个想法: C#中的不可变对象模式 – 你怎么看? 有兴趣听听其他建议或评论。

为什么C#号码类型是不可变的?

为什么int和double都是不可变的? 每次要更改值时返回新对象的目的是什么? 我问的原因是因为我正在创建一个类: BoundedInt ,它有一个值以及一个上限和下限。 所以我想知道:我是否应该使这种类型不变? (或者它应该是一个struct吗?)

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

这是我上一次采访的方式: 问题:字符串存储在哪里? 答:堆是因为它是参考类型 问题:请解释以下代码: static void Main(string[] args) { string one = “test”; string two = one; one = one + ” string”; Console.WriteLine(“One is {0}” , one); Console.WriteLine(“Two is {0}”, two); } 答案:画了两张如下图: (代表声明, string two = one; (表示语句, one = one + ” string”; ;.在堆上创建一个新字符串并分配) 问题:正确。 为下面的代码片段绘制类似的内容: class Program { static void Main(string[] […]

在.NET中跨AppDomains移动对象

有没有办法在AppDomains之间有效地共享或移动.NET对象? 我意识到AppDomains的目的是提供隔离 – 但是我有一个案例需要移动一组相对较大的缓存的不可变对象,这些对象的计算和创建都很昂贵。 目前,我有一个可行的序列化方法,但速度很慢。

使用AutoFixture实例化对象时,指定属性值

我的测试要求我将不可变Rsvp对象的Response属性(见下文)设置为特定值。 public class Rsvp { public string Response { get; private set; } public Rsvp(string response) { Response = response; } } 我最初尝试使用Build().With(x => x.Rsvp, “Attending”) ,但意识到这只支持可写属性。 我将其替换为Build().FromFactory(new Rsvp(“Attending”)) 。 这可行,但对于更复杂的对象来说很麻烦,因为它们与某些属性无关。 例如,如果Rsvp对象具有CreatedDate属性,则此实例化对象的方法将强制我编写Build().FromFactory(new Rsvp(“Attending”, fixture.Create())) 。 有没有办法只为不可变对象指定含义属性的值?

.NET中是否可以使用不可变数组?

是否有可能以某种方式将System.Array标记为不可变。 当置于public-get / private-set之后,它们无法添加,因为它需要重新分配和重新分配,但消费者仍然可以设置他们希望的任何下标: public class Immy { public string[] { get; private set; } } 我认为readonly关键字可能会起作用,但没有这样的运气。

可变类型的不可变视图

我有一个项目,我需要在执行流程之前构建大量的配置数据。 在配置阶段,将数据变为可变非常方便。 但是,一旦配置完成,我想将该数据的不可变视图传递给function过程,因为该过程将依赖于其许多计算的配置不变性(例如,基于预先计算事物的能力)初步配置。)我想出了一个可能的解决方案,使用接口来公开一个只读视图,但我想知道是否有人遇到过这种方法的问题,或者是否有其他建议如何解决这个问题。 我正在使用的模式的一个例子: public interface IConfiguration { string Version { get; } string VersionTag { get; } IEnumerable Devices { get; } IEnumerable Commands { get; } } [DataContract] public sealed class Configuration : IConfiguration { [DataMember] public string Version { get; set; } [DataMember] public string VersionTag { get; set; } [DataMember] public […]