16

私はこれを見ます

このパッケージは、不変コレクションとも呼ばれる、スレッド セーフで内容が決して変更されないことが保証されているコレクションを提供します。

しかし、ImmutableArray をいつ使用する必要があるのか​​正確にはわかりません。

編集: 現在、Microsoft の github パッケージは .NET エコシステムの一部になっています。リファレンスはこちらになりました

4

2 に答える 2

15

不変オブジェクトは、作成後に状態を変更できないオブジェクトとして定義できます。最も広く使用されている不変オブジェクトは、確かにStringオブジェクトです。不変オブジェクトは、スレッドの安全性が懸念される場合や、オブジェクトのインスタンスがコード外のreadonlyモードでアクセスされる必要がある場合に役立ちます。

利点:

  • スレッドセーフ
  • データが変更されるリスクなしに、クラス外で不変オブジェクトの参照を安全に渡すことができます

短所:

  • メモリ使用量
  • update と append の速度は 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 に答える