发布于 2013-06-26 11:27:52
不可变数组类似,但与readonly对象不完全相同。后者可以用来阻止你改变它,但它仍然可以被别人改变。与ExpandoObject或大多数其他对象列表和C#中的其他对象不同,不可变数组保证永不更改。
这也意味着定义后不能更改值,或者可以将数组附加到其中。当使用方法更改或更新时,您将收到一个新的不可变数组。
例如:
ImmutableArray<byte> byteArray = ImmutableArray.Create(new byte[] { 0, 1, 2, 3 });将始终具有可变数组new byte[] { 0, 1, 2, 3 }提供的值,除非再次定义它。
发布于 2013-06-26 11:29:25
不可变对象可以定义为其状态在创建后不能修改的对象。最广泛使用的不可变对象当然是String对象。当线程安全问题和/或必须以readonly模式访问代码之外的对象实例时,不可变对象非常有用。
优势:
Disadvantages:
如何使用:
一般来说,您将使用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不会消耗更多内存。
enumeration,支持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()相同的情况下使用上面的代码行。
https://stackoverflow.com/questions/17318688
复制相似问题