我看到这个:
这个包提供了线程安全的集合,并且保证永远不会改变它们的内容,也称为不可变集合。
但我不明白究竟是什么,什么时候应该使用 ImmutableArray?
编辑:如今,微软的 github 包已经成为 .NET 生态系统的一部分。参考现在在这里。
不可变对象可以定义为创建后状态无法修改的对象。使用最广泛的不可变对象当然是String
对象。当关注线程安全和/或必须在模式下在代码之外访问对象的实例时,不可变对象很有用readonly
。
优点:
缺点:
如何使用:
一般来说,您会使用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()
.
不可变数组与对象类似,但并不完全相同readonly
。后者可以用来防止你改变它,但它仍然可以被别人改变。不可变数组保证永远不会更改,这与诸如ExpandoObject
或大多数其他对象列表之类的东西不同,并且保留在 C# 中。
这也意味着定义后不能更改值,或者可以附加数组。使用方法更改或更新时,您将收到一个新的不可变数组。
例如:
ImmutableArray<byte> byteArray = ImmutableArray.Create(new byte[] { 0, 1, 2, 3 });
new byte[] { 0, 1, 2, 3 }
除非再次定义,否则将始终具有可变数组给出的值。