この記事を読んで、var と IEnumerable の違いを理解しています。著者は次のように 4 つのポイントを書きました。
- その場で「カスタム」型を作成する場合は、Var 型を使用します。
- クエリ結果の型が既にわかっている場合は、IEnumerable を使用します。
- Var はリモート コレクションにも適しています。
- IEnumerable は、メモリ内コレクションに適しています。
ポイントNo. 3と4はよくわかりません。例を挙げてこれらの点を理解するのを手伝ってください
この記事を読んで、var と IEnumerable の違いを理解しています。著者は次のように 4 つのポイントを書きました。
ポイントNo. 3と4はよくわかりません。例を挙げてこれらの点を理解するのを手伝ってください
ここではすべてが間違っているので、少なくとも簡単に:
var
それは変わりません。IEnumerable
一般に、メモリ内コレクションを表すだけであり(最終的なストレージに関係なく、コレクションが遵守するための契約にすぎないため、そうする必要はありません)、アイデアはこの質問の残りの部分と大部分が並置されています。var
ただし、より広い概念のセットを提供するための の使用に関する注意: の使用var
は、現在のステートメントに基づいて結果の型が明らかな場合にのみ、一般的に良い考えです。ダレンの推論や、それがどのように役立つかはよくわかりません。 、ただし、次の点を考慮してください。
var results0 = new List<string>(); // assignment type is obvious
var results1 = something.GetResult(); // read must investigate to know
var
暗黙的に型指定された単なるローカル変数です。コンパイラに型を決定させるだけです。
var i = 10; // Implicitly typed
int j = 10; // Explicitly typed
また、匿名型を扱う場合にも非常に便利です。
var anon = new { Foo = "Bar" };
Console.WriteLine(anon.Foo); // Puts "Bar" on console.
言うならvar MyList = SomeStringCollection.ToList()
; MyEnumerator = MyList.GetEnumerator(); , then the type of
MyList will be
List , and the type of
MyEnumerator will be
List.Enumerator , which is a *value type* that implements
IEnumerator , and will thus exhibit *value semantics*. If the type of
MyList had been
IEnumerable , the return type of
MyList.GetEnumerator()参照セマンティクスwould have been
を持つ IEnumerator` 。
この違いは、たとえば、IEnumerator<String>
. このようなメソッドを type の変数で複数回IEnumerator<String>
呼び出すと、各呼び出しは列挙から次の 5 つの項目を読み取ります。対照的に、このようなメソッドを のような値型で複数回List<String>.Enumerator
呼び出すと、各呼び出しは列挙状態を を実装する新しいヒープ オブジェクトにコピーし、IEnumerator<T>
そのオブジェクトをメソッドに渡します (メソッドは 5 つの項目を読み取ります)。そのオブジェクトとそれに関連付けられたスペースを破棄します (元の変数に関連付けられた列挙状態は影響を受けません)。
おそらく 99% のケースで、値セマンティクスまたは参照セマンティクスのいずれかが列挙子で同等に受け入れられることに注意してください。それらの大部分では、値セマンティクスによってコードの実行が速くなり、コードの実行が大幅に遅くなることはほとんどありません。さらに、列挙子が値型として動作することを知っていると、意味的に役立つ場合があります (たとえば、コレクションの一部を繰り返し再列挙できるようにしたい場合)。一方、 の実装を使用するコードは、使用しIEnumerator<T>
ている可能性のある実装の種類を認識しておくことをお勧めします。