.NET の非ジェネリック コレクションは廃止されましたか?
-
09-06-2019 - |
質問
別の言い方をすると:
タイプセーフなコレクションではなく、緩やかに型指定されたコレクションを選択する十分な理由はありますか (HashTable と辞書)?それらは互換性のためだけにまだ存在しているのでしょうか?
私の理解する限り、ジェネリック コレクションはタイプセーフであるだけでなく、パフォーマンスも優れています。
このトピックに関する包括的な記事は次のとおりです。 C# 2.0 を使用したデータ構造の徹底的な調査.
解決
非ジェネリック コレクションは非常に時代遅れであるため、Silverlight および Live Mesh で使用される CoreCLR から削除されました。
他のヒント
COM の可視性にも問題があります - COM 相互運用はジェネリックスでは使用できません
今後は、汎用コレクションのみを使用する必要があります。コレクション内の型のボックス化/ボックス化解除を回避できるという利点もあります。これは、特にコレクションに格納されるときに System.Object に変換される値型のコレクションがある場合、その結果、値がコールスタックではなくヒープに格納される場合には非効率的です。
異種のコレクションを格納するために非ジェネリック コレクションを使用することに関しては、いつでも List<object> を使用して同じことを実現できます。この理由だけでも、非汎用コレクションに二度と触れる理由はほとんどないと言えます。
例外は、他の言語で書かれたシステムとの互換性、または .NET Framework の以前のバージョンとの互換性を維持することですが、私に言わせれば、これはかなり「最先端」のケースです。
コレクションの XAML シリアル化は、IList または IDictionary のいずれかの実装に依存しているため、非ジェネリック コレクションは今後しばらくの間使用されることになります。
私は、それらが時代遅れである、またはすぐに削除されるだろうと飛びつくつもりはありません。確かに、理由がない限り、非ジェネリック コレクションの使用は避けるべきです。 ない ジェネリック版は使用しないでください。ArrayList などの非ジェネリック コレクションをサポートする、数千行のレガシー (それほどレガシーではない) コードが依然として (そして何年も存在するでしょう) 存在します。これらがあったので、 のみ .NET 1.0 および 1.1 のコレクションでは、年間を通じて広く使用 (および悪用) されてきました。
私は今でも、IList オブジェクトを返す .NET 1.1 で書かれた古い O/R マッパーを操作する必要があることがあります。汎用の List<> への変換を行うメソッドがありますが、これは効率的ではありませんが、それがその方法です。
そして、異なるオブジェクトを同じ配列に保存する必要がある場合 (奇妙なことですが可能です)、 意思 非ジェネリックなコレクションが必要です。ボクシングとボクシング解除のペナルティは、いずれにせよ支払わなければならないものです。
必要があると感じたら、ためらわずに使用してください。
未知の型のオブジェクト、または複数の異なる型のオブジェクトを保存する必要がある場合がありますが、保存するオブジェクトの型が実際にわかっている場合は、ジェネリック バージョンを使用しない理由がわかりません。
編集:コメントどおり、使用できます List<Object>
- やったー!
はい、私が理解している限り、それらは既存の製品との互換性のためだけに存在します。常にタイプ セーフ バージョンを使用する必要があります (つまり、System.Collections ではなく System.Collections.Generic を使用します)。