16

我看到这个

这个包提供了线程安全的集合,并且保证永远不会改变它们的内容,也称为不可变集合。

但我不明白究竟是什么,什么时候应该使用 ImmutableArray?

编辑:如今,微软的 github 包已经成为 .NET 生态系统的一部分。参考现在在这里

4

2 回答 2

15

不可变对象可以定义为创建后状态无法修改的对象。使用最广泛的不可变对象当然是String对象。当关注线程安全和/或必须在模式下在代码之外访问对象的实例时,不可变对象很有用readonly

优点:

  • 线程安全
  • 在类之外传递不可变对象的引用是安全的,而不会有数据被更改的风险

缺点:

  • 内存使用情况
  • 更新和追加的速度是 O(log n)(它被实现为二叉树

如何使用:

一般来说,您会使用ImmutableArray静态类的工厂方法,如此处所述

// open the namespace
using System.Collections.Immutable;

可以从可变数组创建不可变数组,例如:

var array1 = ImmutableArray.Create<byte>(new byte[] { 0, 1, 2, 3 });
var astring = ImmutableArray.Create<char>("test".ToCharArray());

或者我们可以从另一个不可变数组创建不可变数组..

var array2 = ImmutableArray.Create<byte>(new byte[] { 0, 1, 2, 3 });
var array3 = array1 + array2;

在这种情况下,array3不会消耗更多内存。
ImmutableArray 支持枚举,即IEnumerable<T>。所以它可以像这样使用:

foreach (byte b in array1)
    Console.Write(b + " ");

它实现了ICloneable接口:

array5 = array1.Clone();

ImmutableArray<T>还覆盖和实现Equals()和 '==' 和 '!=' 运算符。

// similar to array1 == array2
Console.WriteLine("array1 equals array2: {0}", (array1.Equals(array2)); 

到目前为止,您可以使用上面的代码行,以防array1 != array2! Equals().

于 2013-06-26T11:29:25.783 回答
12

不可变数组与对象类似,但并不完全相同readonly。后者可以用来防止你改变它,但它仍然可以被别人改变。不可变数组保证永远不会更改,这与诸如ExpandoObject或大多数其他对象列表之类的东西不同,并且保留在 C# 中。

这也意味着定义后不能更改值,或者可以附加数组。使用方法更改或更新时,您将收到一个新的不可变数组。

例如:

ImmutableArray<byte> byteArray = ImmutableArray.Create(new byte[] { 0, 1, 2, 3 });

new byte[] { 0, 1, 2, 3 }除非再次定义,否则将始终具有可变数组给出的值。

于 2013-06-26T11:27:52.903 回答