13

仕事で .NET ジェネリックを使用したことはありませんが、かなり人気があることは理解しています。誰かがそれらを学ぶための良いリンクや本の提案を持っていますか? おまけとして。私は.NETジェネリックコレクションとは何か、そしてそれらが何をするのかを漠然としか理解していません....NETの通常のコレクションよりも大きな利点を得るためにそれらをどのように使用するかの実用的な例はありますか?

4

8 に答える 8

11

当然の選択..

MSDN C# ジェネリック

于 2008-09-17T16:41:17.203 に答える
5

Jeffrey Richter による C# による CLR は、ジェネリックについて詳しく説明しており、すべての .NET 開発者が所有して読むべき貴重なリソースの 1 つです。

于 2008-09-17T16:44:17.353 に答える
1

C++ テンプレートを使用したことがある場合、.Net ジェネリックはほぼ同じものです。同様の <T> 構文も使用します。

C++ をまったく知らない場合でも、特にコレクションに関しては、これを必要以上に難しくしている可能性があります。それらは他のコレクションと同じですが、それらを作成するときに <<> 内に型名を指定して、コンパイラが保持する項目の種類を認識できるようにします。

于 2008-09-17T16:44:22.890 に答える
0

C# 3.0 in a Nutshell は、肥大化することなく概念を理解するのに十分な大きさの例を含む素晴らしい参考書です。

于 2008-09-17T16:50:33.670 に答える
0

WROX の Professional .NET 2.0 Generics には多くの実例が含まれているため、非常に便利であることがわかりました。ジェネリックは初心者にとっては混乱を招く可能性がありますが、経験豊富な開発者にとっては非常に便利で強力な時間節約ツールになる可能性があります。個人的には、.NET Generics は、コレクションの定義と使用を簡素化するのに最も役立つと思います。また、ジェネリックを使用すると、通常はボックス化/ボックス化解除の型変換に関連するパフォーマンス ヒットを最小限に抑えることができるため、より効率的なコードにつながる可能性があります。

于 2008-09-17T17:02:10.210 に答える
0

このテーマに関する Microsoft のトレーニングに従うことをお勧めします。本を探している場合は、次のものが理想的です。

http://www.microsoft.com/MSPress/books/9469.aspx

于 2008-09-17T18:43:53.400 に答える
-4

私の投票は-ほとんどあなたはそれらを避けることができます:)

ジェネリックの主な利点は、キャストを内部で行うことになっても意味がない場合に、キャストを節約できることです。この問題を調べてみると、ほとんどのジェネリックの候補は、そのような利点のために内部的にネイティブ ストレージを作成できるコレクション/セットであることがわかります。一方、他のほとんどのコンポーネントは、パフォーマンスがほとんどまたはまったく向上せず、インターフェイス継承の実装と比較して柔軟性が大幅に低下します。

キャストが非常に煩わしい場合は、IronPython のような動的言語を検討する時期かもしれません :)

そして、一般的なことが理にかなっていると思うシナリオに実際に遭遇した場合は、別の質問として投稿してください。ここの頭脳は一緒に見て、ケースバイケースで解決できます:)

更新: はい、コンパイラのチェックは素晴らしいですが、Castle Project のソースを確認してください。キャストを行うことができないため、ジェネリック型が邪魔になる多くの状況を見ることができます。 BusinessObject から継承したものを BusinessObject にキャストし直して、継承された関数にアクセスすることを想定していません。通常、コードは BusinessObjectBase -> BusinessObject -> Your actual class として終了するのを見ました。そのため、ジェネリックを使用することが常に有益であるとは限らないと感じています-そして、私はそのような実装を悪用し、ジェネリック型付けでおかしな関数をたくさん持つことになった人の1人でした。

更新#2:ボックス化/ボックス化解除は、抽象型(オブジェクトなど)を使用して値を保存し、強い型指定された値を使用して再度保存するときにオブジェクトをキャストする必要があることを意味します(キャストが必要です)。大きな違いはありません。私が述べた収集状況とは別に参照してください。AND このようなコードはまだボクシングを行います:

public T GetValue<T>() {
  return (T) ...;
}

それは私が最も頻繁に見た一般的な虐待です。人々はここでネイティブ タイプを扱っていると思っていますが、実際はそうではありません。代わりに、一般的な構文にキャストするだけです。本当に理にかなっているのはこれです:

public class MyList<T>
{
  private List<T> _list;
...
public T GetValue(int index)
{
  return _list[index];
}

それから、コレクション ストレージに戻ります。そのため、コレクションの保存後にジェネリックが役立つ可能性はあまりないと言いました。このチュートリアルから参照: http://en.csharp-online.net/Understanding_Generics—Revisiting_Boxing_and_Unboxing

于 2008-09-17T16:50:38.943 に答える