Tag: 不变性

是否有一种简单的方法来创建一个类的不可变版本?

有一种简单的方法可以使实例不可变吗? 让我们举个例子,我有一个包含大量数据字段的类(只有数据,没有行为): class MyObject { // lots of fields painful to initialize all at once // so we make fields mutable : public String Title { get; set; } public String Author { get; set; } // … } 创建示例: MyObject CreationExample(String someParameters) { var obj = new MyObject { Title = “foo” // lots […]

我可以使用JavascriptSerializer反序列化为不可变对象吗?

使用System.Web.Script.Serialization.JavaScriptSerializer 我可以以某种方式反序列化为不可变对象吗? public class Item { public Uri ImageUri { get;private set; } public string Name { get; private set; } public Uri ItemPage { get;private set; } public decimal Retail { get;private set; } public int? Stock { get; private set; } public decimal Price { get; private set; } public Item(Uri imageUri, string […]

如何创建ImmutableDictionary的新实例?

我想写这样的东西: var d = new ImmutableDictionary { { “a”, 1 }, { “b”, 2 } }; (使用System.Collections.Immutable中的 ImmutableDictionary )。 这似乎是一个简单的用法,因为我预先声明了所有的价值 – 那里没有变异。 但这给了我错误: 类型’ System.Collections.Immutable.ImmutableDictionary ‘没有定义构造函数 我应该如何用静态内容创建一个新的不可变字典?

如何在c#中序列化/反序列化不可变列表类型

如果我定义了一个类 [DataContract()] class MyObject { [DataMember()] ImmutableList Strings { get; private set} } ImmutableList类型来自immutables库https://www.nuget.org/packages/Microsoft.Bcl.Immutable 。 请注意,类ImmutableList没有默认构造函数或可变的Add方法。 将内容添加到列表中即可获取表单。 myList = myList.Add(“new string”); 我是否可以为.NET序列化机制添加一些自定义支持以支持此类型并向其显示如何对其进行反序列化? 目前,在反序列化时只会跳过该集合,尽管可以将其序列化。

C#中的不可变类型和属性

C#中的不可变类型和不可变属性是什么意思? 你能举一个简单的例子吗?

C#中的字符串不变性

我很好奇StringBuilder类是如何在内部实现的,所以我决定查看Mono的源代码并将其与Reflector的反汇编代码进行比较。 从本质上讲,Microsoft的实现使用char[]在内部存储字符串表示,并使用一堆不安全的方法来操作它。 这很简单,没有提出任何问题。 但当我发现Mono在StringBuilder中使用一个字符串时,我很困惑: private int _length; private string _str; 第一个想法是:“多么无谓的StringBuilder”。 但后来我发现可以使用指针改变字符串: public StringBuilder Append (string value) { // … String.CharCopy (_str, _length, value, 0, value.Length); } internal static unsafe void CharCopy (char *dest, char *src, int count) { // … ((short*)dest) [0] = ((short*)src) [0]; dest++; src++; } 我曾经在C / C ++中编程一点,所以我不能说这段代码让我很困惑,但我认为字符串是完全不可变的(即绝对没有办法改变它)。 所以实际的问题是: 我可以创建一个完全不可变的类型吗? […]

为什么字典键是不可变的?

有一个问题,为什么他们要求使用不可变对象作为字典中的键。 当我最近使用一个字典(显然不是为了Hash表的目的)将Xml Node对象作为键放置时,问题实际上在我的脑海里。 然后我在使用期间多次更新节点。 那么“使用不可变密钥”究竟意味着什么呢?

不可变还是不可变?

好吧,据我所知, 不可变类型本质上是线程安全的,所以我在不同的地方读过,我想我明白为什么会这样。 如果在创建对象后无法修改实例的内部状态,则对实例本身的并发访问似乎没有问题。 因此,我可以创建以下List : class ImmutableList: IEnumerable { readonly List innerList; public ImmutableList(IEnumerable collection) { this.innerList = new List(collection); } public ImmutableList() { this.innerList = new List(); } public ImmutableList Add(T item) { var list = new ImmutableList(this.innerList); list.innerList.Add(item); return list; } public ImmutableList Remove(T item) { var list = new ImmutableList(this.innerList); list.innerList.Remove(item); return […]

不变的collections品?

我在我的应用程序中创建了大多数基本类型,不可变。 但是collections品也应该是不可变的吗? 对我来说,这似乎是一个巨大的开销,除非我错过了什么。 我在谈论集合以保存Point3值等,可以在不同时间添加它们。 因此,如果集合中有1M值,并且您需要删除其中的1个,则必须重新创建相同的集合,对吧?