私はこれを見ます:
このパッケージは、不変コレクションとも呼ばれる、スレッド セーフで内容が決して変更されないことが保証されているコレクションを提供します。
しかし、ImmutableArray をいつ使用する必要があるのか正確にはわかりません。
編集: 現在、Microsoft の github パッケージは .NET エコシステムの一部になっています。リファレンスはこちらになりました。
私はこれを見ます:
このパッケージは、不変コレクションとも呼ばれる、スレッド セーフで内容が決して変更されないことが保証されているコレクションを提供します。
しかし、ImmutableArray をいつ使用する必要があるのか正確にはわかりません。
編集: 現在、Microsoft の 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 }
再度定義されない限り、可変配列で指定された値が常に保持されます。