Tag: immutability

C#immutable int

在Java中,字符串是不可变的。 如果我们有一个字符串并对其进行更改,我们将获得由同一个变量引用的新字符串: String str = “abc”; str += “def”; // now str refers to another piece in the heap containing “abcdef” // while “abc” is still somewhere in the heap until taken by GC 据说 int和double在C#中是不可变的。 这是否意味着当我们有int并且稍后更改它时,我们会得到同一个变量“指向”的新int? 同样的事情,但堆栈。 int i = 1; i += 1; // same thing: in the stack there is value 2 […]

不可变类vs结构

以下是类与C#中的结构不同的唯一方法(如果我错了请纠正我): 类变量是引用,而struct变量是值,因此struct的整个值被复制到赋值和参数传递中 类变量是存储在堆栈上的指针,指向堆上的内存,而struct变量作为值存储在堆上 假设我有一个不可变的结构,即struct,其字段在初始化后无法修改。 每次我将此结构作为参数传递或在赋值中使用时,该值都将被复制并存储在堆栈中。 然后假设我将这个不可变的结构化为一个不可变的类。 此类的单个实例将创建一次,并且只有对类的引用将被复制到赋值和参数传递中。 如果对象是可变的,那么这两种情况下的行为将是不同的:当一个人改变对象时,在第一种情况下,结构的副本将被修改,而在第二种情况下,原始对象将被改变。 但是,在这两种情况下,对象都是不可变的,因此这个对象的用户实际上是类还是结构没有区别。 由于复制引用比复制struct便宜,为什么要使用不可变结构? 此外,由于可变结构是邪恶的 ,看起来根本没有理由使用结构。 我哪里错了?

如何在C#中声明一个局部常量?

如何在C#中声明一个局部常量? 与在Java中一样,您可以执行以下操作: public void f(){ final int n = getNum(); // n declared constant } 如何在C#中做同样的事情? 我尝试使用readonly和const但似乎没有工作。 任何帮助将不胜感激。 谢谢。

CA2104警告:有没有办法将类标记为“不可变”来抑制它?

请考虑以下代码,它引发CA2104: Do not declare read only mutable reference types. public class Test { // This provokes CA2104: “Do not declare read only mutable reference types”. protected readonly ImmutableClass ImmutableMember; } public class ImmutableClass { } 有没有人知道一种方法将类标记为不可变的方式会抑制警告CA2104? 我尝试使用[ImmutableObject(true)]装饰MutableClass而没有成功的希望(因为该属性对于表单编辑器来说非常清楚),并且肯定它不起作用。 我假设Code Analysis在确定是否发出CA2104时使用已知的不可变类型列表,因此我们不能使用相同的方法。 我想即使你可以将一个类标记为不可变,编译器也无法实际检查它是否为真,但至少它可能是一个有用的指标。 无论如何,我有什么属性可以忽略吗? 如果没有,就必须进行压制。 目前似乎没有替代方法可以做到这一点 。 我找到了一个有趣的博客,来自Joe Duffy(“Windows上的并发编程”一书的作者)关于这种事情 。 他从“想象我们有一个不可变的属性”开始。 …… 🙂 这很有意思 – 他遇到了编写一些新的FxCop规则来分析属于不可变的类型的麻烦。

字符串在C#中没有变化时字符串的可变性?

如果字符串操作没有改变字符串的值,那么最终是否会创建新实例?例如; string str=”foo”; str+=””; 我知道C#中string和stringbuilder的区别。

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

鉴于可变结构通常被认为是邪恶的(例如, 为什么可变结构“邪恶”? ),是否有潜在的好处可能促使.NET框架的设计者制作System.Windows.Point和System.Windows.Vector可变的? 我想理解这一点,所以我可以决定是否有必要使我自己的类似结构可变(如果有的话)。 将Point和Vector变为可变的决定可能只是判断错误,但如果有充分的理由(例如,性能优势),我想了解它是什么。 我知道我偶然发现了Vector.Normalize()方法的实现,因为它惊讶(!),不会返回一个新的Vector 。 它只是改变了当前的向量。 我一直认为它应该像这样工作: var vector = new Vector(7, 11); var normalizedVector = vector.Normalize(); // Bzzz! Won’t compile 但它实际上是这样的: var vector = new Vector(7, 11); vector.Normalize(); // This compiles, but now I’ve overwritten my original vector ……所以,似乎不变性只是为了避免混淆是一个好主意,但同样,也许在某些情况下可能会引起混淆。

如何实例化不可变的相互递归对象?

我有一个不可变的递归类型: public sealed class Foo { private readonly object something; private readonly Foo other; // might be null public Foo(object something, Foo other) { this.something = something; this.other = other; } public object Something { get { return something; } } public Foo Other { get { return other; } } } 我需要实例化这种相互引用的两个对象,即a.Other == b […]

如何制作参考类型的副本

可能重复: 在C#中克隆对象 我有一个包含属性的类,其中一些是引用类型(其他类的实例)本身( CookieContainer )。 我想拥有此类的精确副本,因此对先前版本的任何更改都不会影响此新实例。 是否存在针对此类问题的通用解决方案,或者我应该手动执行此操作?

适用于.NET的高效,不可变,可扩展的集合

在我看来,.NET存在极端缺乏安全,不可变的集合类型,特别是BCL,但我也没有看到外面的工作。 有没有人有一个(最好)生产质量,快速,不可变的.NET集合库的任何指针。 快速列表类型是必不可少的。 我还没准备好切换到F#。 *编辑:注意搜索者,很快就会进入BCL: .NET不可变集合