1

この記事を読んで、var と IEnumerable の違いを理解しています。著者は次のように 4 つのポイントを書きました。

  1. その場で「カスタム」型を作成する場合は、Var 型を使用します。
  2. クエリ結果の型が既にわかっている場合は、IEnumerable を使用します。
  3. Var はリモート コレクションにも適しています。
  4. IEnumerable は、メモリ内コレクションに適しています。

ポイントNo. 3と4はよくわかりません。例を挙げてこれらの点を理解するのを手伝ってください

4

4 に答える 4

6

ここではすべてが間違っているので、少なくとも簡単に:

  • これは誤りです。結果の型は、明示的に指定されているかどうかにかかわらず、常に返される型になります。
  • 結果を使用する場合は、とにかく型を知る必要があります。varそれは変わりません。
  • この 3 番目の項目は純粋なポピーコックです。それ自体では意味がありません。
  • IEnumerable一般に、メモリ内コレクションを表すだけであり(最終的なストレージに関係なく、コレクションが遵守するための契約にすぎないため、そうする必要はありません)、アイデアはこの質問の残りの部分と大部分が並置されています

varただし、より広い概念のセットを提供するための の使用に関する注意: の使用varは、現在のステートメントに基づいて結果の型が明らかな場合にのみ、一般的に良い考えです。ダレンの推論や、それがどのように役立つかはよくわかりません。 、ただし、次の点を考慮してください。

var results0 = new List<string>();    // assignment type is obvious 
var results1 = something.GetResult(); // read must investigate to know
于 2013-06-17T07:53:33.403 に答える
1

var暗黙的に型指定された単なるローカル変数です。コンパイラに型を決定させるだけです。

var i = 10; // Implicitly typed
int j = 10; // Explicitly typed

また、匿名型を扱う場合にも非常に便利です。

var anon = new { Foo = "Bar" };
Console.WriteLine(anon.Foo); // Puts "Bar" on console.

詳細はこちら。

于 2013-06-17T07:51:49.537 に答える
1

言うならvar MyList = SomeStringCollection.ToList(); MyEnumerator = MyList.GetEnumerator(); , then the type ofMyList will beList , and the type ofMyEnumerator will beList.Enumerator , which is a *value type* that implementsIEnumerator , and will thus exhibit *value semantics*. If the type ofMyList had beenIEnumerable , the return type ofMyList.GetEnumerator()参照セマンティクスwould have beenを持つ IEnumerator` 。

この違いは、たとえば、IEnumerator<String>. このようなメソッドを type の変数で複数回IEnumerator<String>呼び出すと、各呼び出しは列挙から次の 5 つの項目を読み取ります。対照的に、このようなメソッドを のような値型で複数回List<String>.Enumerator呼び出すと、各呼び出しは列挙状態を を実装する新しいヒープ オブジェクトにコピーし、IEnumerator<T>そのオブジェクトをメソッドに渡します (メソッドは 5 つの項目を読み取ります)。そのオブジェクトとそれに関連付けられたスペースを破棄します (元の変数に関連付けられた列挙状態は影響を受けません)。

おそらく 99% のケースで、値セマンティクスまたは参照セマンティクスのいずれかが列挙子で同等に受け入れられることに注意してください。それらの大部分では、値セマンティクスによってコードの実行が速くなり、コードの実行が大幅に遅くなることはほとんどありません。さらに、列挙子が値型として動作することを知っていると、意味的に役立つ場合があります (たとえば、コレクションの一部を繰り返し再列挙できるようにしたい場合)。一方、 の実装を使用するコードは、使用しIEnumerator<T>ている可能性のある実装の種類を認識しておくことをお勧めします。

于 2013-06-17T16:28:47.803 に答える