別の言い方をすると:
タイプセーフなコレクションよりも緩く型付けされたコレクションを選択する正当な理由はありますか (HashTable と Dictionary)? それらは互換性のためだけにまだ存在しますか?
私が理解している限りでは、ジェネリック コレクションはタイプ セーフであるだけでなく、パフォーマンスも優れています。
このトピックに関する包括的な記事は次のとおりです: C# 2.0 を使用したデータ構造の広範な調査。
別の言い方をすると:
タイプセーフなコレクションよりも緩く型付けされたコレクションを選択する正当な理由はありますか (HashTable と Dictionary)? それらは互換性のためだけにまだ存在しますか?
私が理解している限りでは、ジェネリック コレクションはタイプ セーフであるだけでなく、パフォーマンスも優れています。
このトピックに関する包括的な記事は次のとおりです: C# 2.0 を使用したデータ構造の広範な調査。
非ジェネリック コレクションは非常に古いため、Silverlight と Live Mesh で使用される CoreCLR から削除されました。
COM の可視性にも問題があります - COM 相互運用はジェネリックでは使用できません
今後は、ジェネリック コレクションのみを使用する必要があります。コレクション内の型のボックス化/ボックス化解除を回避する利点もあります。これは、コレクションに格納されるときに System.Object に変換される値型のコレクションがある場合は特に、非効率的です。そのため、コールスタックではなくヒープに値が格納されます。
異種のコレクションを格納するための非ジェネリック コレクションの使用に関しては、いつでも List<object> を使用して同じことを達成できます。この理由だけでも、非ジェネリック コレクションに再び触れる理由はほとんどないと言えます。
これに対する例外は、他の言語で記述されたシステムとの互換性を維持すること、または以前のバージョンの .NET フレームワークとの互換性を維持することですが、私に言わせれば、それはかなり「エッジの効いた」ケースです。
コレクションの XAML シリアル化は、IList または IDictionary のいずれかを実装することに依存しているため、非ジェネリック コレクションはしばらくの間使用されます。
不明な型のオブジェクトや複数の異なる型のオブジェクトを格納する必要がある場合もありますが、格納するオブジェクトの型が実際にわかっている場合は、汎用バージョンを使用しない理由がわかりません。
編集:コメントされているように、あなたはただ使うことができますList<Object>
-doh!
私は飛びついて、それが時代遅れであるとか、すぐに削除されるとは言いません。ジェネリック バージョンを使用しない理由がない限り、非ジェネリック コレクションの使用を避けるべきであることは事実です。ArrayLists などの非ジェネリック コレクションをサポートする数千行のレガシー (それほどレガシーではない) コードがまだ (そして今後数年間) 出回っています。これらは .NET 1.0 および 1.1 の唯一のコレクションだったため、年間を通じて広く使用 (および悪用) されてきました。
IList オブジェクトを返す、.NET 1.1 で記述された古い O/R マッパーを操作する必要がある場合があります。私は一般的な List<> への変換を行うメソッドを持っていますが、これは効率的ではありませんが、それがその方法です。
また、異なるオブジェクトを同じ配列に格納する必要がある場合 (奇妙ですが可能です) 、非ジェネリック コレクションが必要になります。Boxing と Unboxing のペナルティは、とにかく支払わなければならないものです。
必要だと感じた場合は、恐れずに使用してください。
はい、私が理解している限り、それらは既存の製品との互換性のためにのみ存在します。常にタイプ セーフ バージョンを使用する必要があります (つまり、System.Collections よりも System.Collections.Generic を使用します)。