6

ウィキペディアから:

ジェネリック プログラミングは、アルゴリズムが後で指定される型に関して記述され、パラメーターとして提供される特定の型に対して必要なときにインスタンス化されるコンピューター プログラミングのスタイルであり、1983 年に登場した Ada によって開拓されました。使用時に操作する型のセットのみが異なる共通の関数または型。したがって、重複を減らします。

ジェネリックは、後で指定される型を定義する機能を提供します。項目は既に型指定されているため、項目を使用するために型にキャストする必要はありません。

C# と VB にジェネリックがあるのはなぜですか? それらはどのような利点を提供しますか? それらを使用してどのような利点がありますか?

他にジェネリクスを持つ言語は?

4

15 に答える 15

6

C# と VB には、基になる CLR のジェネリック サポートを利用するためのジェネリックがあります (またはその逆ですか?)。これらを使用すると、静的に型付けされた言語でコードを記述できます。この言語は、それらを使用する型ごとにコードを書き直すことなく (ランタイムがそれを行います)、System.Objectを使用してあらゆる場所にキャストすることなく、複数の種類の型に適用できます。 (ArrayList を使用する必要があったように)。

記事を読みましたか?

これらの言語にはジェネリックもあります。

  • C++ (テンプレート経由)
  • Ada (テンプレート経由)
  • エッフェル
  • D (テンプレート経由)
  • ハスケル
  • ジャワ
于 2008-09-19T04:47:55.623 に答える
5

個人的には、時間を大幅に節約できると思います。私はまだ.NETFramework1.1を使用しており、特定のコレクションが必要になるたびに、CollectionBaseを実装して厳密に型指定されたコレクションを作成する必要があります。Genericsを使用すると、コレクションをそのように宣言するだけでList<MyObject>完了です。

于 2008-09-19T04:49:04.480 に答える
3

次のメソッドシグネチャを検討してください。

//Old and busted
public abstract class Enum
{
  public static object Parse(Type enumType, string value);
}
//To call it:
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString);

//New and groovy
public abstract class Enum
{
  public static T Parse<T>(string value);
}

//To call it:
MyEnum x = Enum.Parse<MyEnum>(someString);

maを見てください:ランタイムタイプの操作はありません。

于 2008-09-24T09:52:55.137 に答える
2

おそらく、それらの最も一般的な使用法は、強く型付けされたArrayListsを持つことです。.NET 1.1では、オブジェクトから目的の型にすべてをキャストするか、CodeSmithなどを使用して強く型付けされたArrayListを生成する必要があります。

さらに、それらはボクシングを減らすのに役立ちます。繰り返しになりますが、.NET 1.xでは、値型でArrayListを使用しようとすると、オブジェクトをボックス化したり、ボックス化したりすることになります。ジェネリックスは、参照か値かにかかわらず、タイプを定義できるようにすることで、それを回避します。

他にも、イベントハンドラー、LINQクエリなどの便利な用途があります。

于 2008-09-19T04:49:14.573 に答える
2

MSDNから:

ジェネリックは、以前のバージョンの共通言語ランタイムと C# 言語の制限に対する解決策を提供します。C# 言語では、ユニバーサル基本型 Object との間で型をキャストすることによって一般化が行われます。ジェネリック クラスを作成することにより、コンパイル時にタイプ セーフなコレクションを作成できます。

この記事の残りの部分を読んで、Generics によってコードの読みやすさとパフォーマンスが向上する例をいくつか確認してください。

于 2008-09-19T04:48:35.450 に答える
1

C#の非ジェネリック型(JavaではなくJavaは別の話です)に対するジェネリックの最大の利点は、それらがはるかに高速であることです。JITは、特定のタイプに対して考え出すことができる最高のマシンコードを生成します。 List<int>実際にはintのリストであり、intをラップする整数オブジェクトではありません。これにより、ジェネリック型が非常に高速になり、型が安全になり、コンパイル時に非常に多くのエラーを検出するのに役立ちます:)

于 2008-09-24T09:56:02.897 に答える
1

.NETのジェネリックは、オブジェクトコレクションに最適です。オブジェクトタイプを好きなように定義でき、たとえば、そのためのコードを記述せずにリストを作成できます。また、Tに対してタイプセーフでありながら、.NETList汎用コレクションのすべての効率的な機能にアクセスできます。素晴らしいもの。

于 2008-09-19T04:50:04.760 に答える
1

ジェネリックは、c++ のテンプレートの概念に基づいて構築されています (テンプレートに精通している場合)。

アルゴリズムまたはデータ構造を実装する方法ですが、それが使用される実際の型を遅らせます。

リストは、選択した任意のタイプの int、string、さらにはリストの作成時に割り当てられるカスタムタイプで割り当てることができます。ただし、リスト操作 add remove などを使用できます。

ジェネリックに慣れることで、コーディングの労力を大幅に節約できます。また、タイプ間でボックス化およびボックス化解除する必要はありません。

Javaにもジェネリックがあります。それらはワイルドカードと呼ばれます。

于 2008-09-19T05:31:53.910 に答える
1

.net のジェネリックは、継承や拡張メソッドと同様に、コードの重複を減らすことができます。リファクタリングの方法で説明しましょう。

共通の祖先を持つすべてのクラスに共通のメソッドがある場合は、共通のメソッドをクラスの共通の祖先に配置します (継承)。

一部のクラスに、パブリック コントラクトを使用して何らかの結果を得る共通メソッドがある場合は、その共通メソッドをそのパブリック コントラクトの拡張メソッドにします。

いくつかのメソッドまたはクラスが同じコードを持ち、そのコードが作用する型のみが異なる場合 (特に、型の詳細がメソッドの操作に関連しない場合)、それらのメソッドまたはクラスをジェネリックにまとめます。

于 2008-09-19T20:27:12.423 に答える
1

ボックス化/ボックス化解除が必要ないため、値型を使用するコレクションのパフォーマンスが向上します。オブジェクトを (たとえば ArrayList を使用して) 目的の型にキャストする必要がないため、使用するのがずっと簡単です。同様に、型の安全性を強化するのにも役立ちます。

于 2008-09-19T20:35:05.337 に答える
0

Objective-C では、プロトコルを使用してジェネリックの目的を達成できます。ただし、この言語は型付けが弱いため、多くの型に対して 1 つのコード パスを使用するために型システムと戦っている場合ほど、一般的には問題になりません。

于 2008-09-19T05:12:41.633 に答える
0

それを説明する最も簡単な方法は、例を挙げることです。1 つは string 型のオブジェクトを int 型にマップし、もう 1 つは string 型のオブジェクトを double 型にマップします。Hashtable を定義してから、K 型と V 型を使用できます。ジェネリックがなければ、「オブジェクト」型を使用する必要があります。これは、意味のあるものにするためにキャストする必要があることに加えて、型安全性を放棄します。Hashtable と Hashtable をインスタンス化するだけで、適切な型チェックなどを備えたハッシュ テーブルを取得できます。

于 2008-09-19T04:47:50.583 に答える
0

Java にはジェネリックもあります。C++ にはテンプレートがあります。

Perl や Javascript などの動的言語には、同じ型の制限がないため、少ない作業でほとんど同じ利点が得られます。

于 2008-09-19T04:47:57.807 に答える
0

個人的には、書く必要のないすべてのコードがあるため、ジェネリックの大ファンです。

制御の反転とは

于 2008-09-19T05:38:23.410 に答える
0

一般的な例はコレクションです。たとえば、Add(T) メソッドと T get() メソッドとしてのタイプ T のセット。同じコード、異なるタイプ セーフ コレクション。

C++、D、Ada などにはテンプレートがあり、ジェネリックのスーパーセットは少し異なるバグを実行し、同じ最終結果 (およびいくつか) を取得します。

IIRC Java にはジェネリクスがありますが、私は Java を扱いません。

于 2008-09-19T04:45:34.240 に答える