.net ジェネリックとは何ですか?

藏色散人
リリース: 2019-05-05 16:09:53
オリジナル
3649 人が閲覧しました



.net ジェネリックとは何ですか?

#ジェネリックの紹介:

ジェネリック タイプ (Generic Type) は、.NET Framework2.0 の最も強力な機能の 1 つです。ジェネリックの主なアイデアは、アルゴリズムをデータ構造から完全に分離することで、一度定義されたアルゴリズムが複数のデータ構造に作用できるようにすることで、再利用性の高い開発を実現します。ジェネリックスを使用すると、実際のデータ型を使用せずにタイプセーフなデータ構造を定義できるため、システムのパフォーマンスが大幅に向上し、高品質のコードが得られます (データ処理アルゴリズムが再利用できるため、型固有のデータ構造を複製する必要がありません)コード)。

ジェネリックスの仕組み:

ジェネリックスは、タイプ セーフでパフォーマンスや作業効率に悪影響を及ぼさないクラスを定義するために使用できます。表面的には、C# ジェネリックの構文は C テンプレートの構文と似ていますが、コンパイラがジェネリックを実装およびサポートする方法に重要な違いがあります。 C テンプレートと比較して、C# ジェネリックはセキュリティを強化できますが、機能が多少制限されています。一部の C コンパイラでは、テンプレート クラスが特定の型で使用されるまで、コンパイラはテンプレート コードをコンパイルしません。型が実際に指定されている場合、コンパイラはコードをインラインで挿入し、一般的な型パラメータが出現するたびに追加します。指定された型に置き換えられます。さらに、特定の型が使用されるたびに、その型がアプリケーション内の他の場所でテンプレート クラスに指定されているかどうかに関係なく、コンパイラはその型に固有のコードを挿入します。C リンカーはこれを解決する必要がありますが、常に解決できるわけではありません。これによりコードが肥大化し、ロード時間とメモリ使用量が増加する可能性があります。

.net Framewrok 2.0 では、ジェネリックは IL および CLR 自体でネイティブ サポートを備えています。汎用 C# コードをコンパイルする場合、他の型と同様に、コンパイラーはまずそれを IL にコンパイルします。ただし、IL には実際の特定の型のパラメーターまたはプレースホルダーのみが含まれており、汎用操作をサポートする専用の IL 命令があります。汎用コードには、メタデータに汎用情報が含まれています。実際の汎用インスタンス化作業は、JIT コンパイル中に「オンデマンド」方式で発生します。 JIT コンパイルが実行されると、JIT コンパイラーはジェネリック IL コードのメタデータ内の T を指定された型の実パラメーターに置き換えて、ジェネリック型をインスタンス化します。これにより、JIT コンパイラーは、ジェネリックがまったく関与していないかのように、型固有の IL メタデータ定義を提供します。 JIT コンパイラーは、パラメーターの正確性を保証し、型安全性チェックを実装し、型固有の IntelliSense を実行することもできます。

.net が汎用 IL コードをネイティブ コードにコンパイルする場合、結果のネイティブ コードは指定された型によって異なります。 JIT コンパイラは、特定の型の IL コードが生成されたことを追跡します。ネイティブ値型が指定されている場合、JIT コンパイラは、ジェネリック型パラメータを指定された値型に置き換えて、ネイティブ コードにコンパイルします。 JIT コンパイラーが、ネイティブ コードにコンパイルされた値型を使用して汎用 IL コードをコンパイルする場合、IL コードへの参照のみが返されます。 JIT コンパイラーは、それ以降のすべての場合に同じ値型固有の IL コードを使用するため、コードの肥大化の問題は発生しません。ネイティブ仕様が参照型の場合、JIT コンパイラーは汎用 IL 型の汎用パラメーターをオブジェクトに置き換えて、ネイティブ コードにコンパイルします。ジェネリック型パラメーターではなく参照型に対する将来のリクエストでは、JIT コンパイラーは実際のコードを再利用するだけで、インスタンスにはマネージド ヒープから離れたサイズで領域が割り当てられ、キャストは行われません。



以上が.net ジェネリックとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート