23

IEnumerable<T>後で参照できるように、パラメーターのクローンを作成する簡単な方法を探しています。LINQのToArray拡張メソッドは、これを行うための優れた簡潔な方法のようです。

ただし、常に新しい配列インスタンスを返すことが保証されているかどうかはわかりません。LINQメソッドのいくつかは、列挙可能なものの実際のタイプをチェックし、可能であればショートカットをチェックします。たとえば、Count()メソッドがを実装ICollection<T>しているかどうかを確認し、実装している場合は、そのCountプロパティを直接読み取ります。必要な場合にのみコレクションを繰り返します。

実用的な場合の短絡の考え方を考えると、ToArray()すでに配列であるものを呼び出すと、短絡して同じ配列インスタンスを返す可能性があるようです。ToArray()これにより、メソッドの要件が技術的に満たされますToArray

簡単なテストから、.NET 4.0ではToArray()、配列を呼び出すと新しいインスタンス返されるようです。私の質問は、これに頼ることができますか?ToArraySilverlightや.NETFrameworkの将来のバージョンでも、常に新しいインスタンスが返されることを保証できますか?この点で明確なドキュメントはどこかにありますか?

4

2 に答える 2

26

はい、ToArray常に新しい配列を返します。既存の値を返すように変更すると、ひどく壊れるような変更になります。.NETチームはこれを行わないだろうと完全に確信しています。信頼できることは重要なことです。文書化されていないのは残念です:(

LINQ to Objectsには、おそらく信頼する価値のない微妙な動作がたくさんありますが、この場合、それは非常に大きな動作であるため、変更されることに絶対に驚かされます。

短絡は、動作に影響を与えない場合に最適ですが、一般に、LINQ to Objectsは、有効な場合にのみ最適化するのに適しています。最適化をカバーする私のEdulinqシリーズの2つの 投稿を見たいと思うかもしれません。

于 2011-05-20T15:38:36.587 に答える
16

そのToArrayメソッドは.NETFrameworkの内部にあるので、MSに人生を賭けて変更することはありません。ただし、私が行うことは、ToArrayが新しい配列インスタンスを返すことを表明する単体テストを追加することです。

Assert.AreNotSame(myArray, myArray.ToArray());

そうすれば、後で.NET Frameworkのバージョンを変更した場合でも、機能が変更されたかどうかが自動的にわかります。

于 2011-05-20T15:40:31.357 に答える