-1

それらが何であるかは理解していますが、いつ使用するのが最適なのか疑問に思っています。

私が最初に考えたのは、さまざまなデータ型に対して特定の操作を実行する必要がある (静的) ユーティリティ クラスを作成するときです。したがって、ジェネリック メソッドを使用して、特定のメソッドの多数のオーバーロードを回避することをお勧めします。これについてコメントしてください。

私は小さなサンプルクラスを持っています。これは、例のためだけです。

public static class Math<T> where T : operator +, operator -
{
    public static T Add(T a1, T a2)
    {
        return a1+a2;
    }

    public static T Subtract(T a1, T a2)
    {
        return a1 - a2;
    }
}
  1. これはジェネリック クラスとメソッドの適切な使用法でしょうか。たとえば、最小量のコードで int、double などを加算および減算したいですか?

  2. なぜこれはコンパイルされないのですか? クラス署名を変更するだけでなく、これを試しました:

    public static class Math<T> where T : struct

Type パラメーターが参照型か値型かを指定する必要があることは理解しています。T を値型として制約する必要があることを指定することでそれを行いましたが、演算子 + および/または - を T に適用できないというエラーが引き続き発生するのはなぜですか (具体的には値型である必要があります)。

4

3 に答える 3

0

ジェネリック クラスの明らかなユース ケースは、すべてのデータを のインスタンスとして扱うことなく、任意のタイプのデータを格納できるデータ構造ですobject。おそらくこれらを常に使用します -IList<T>などIDictionary<K, V>。型の安全性を維持しながら、構造を書いているときに型がわからないものを格納できます。秘訣は、保存しているタイプについても何も知らないため、あまり操作できないことです。

したがって、何かが参照型または値型である、またはパラメーターなしのコンストラクターを持っている、またはインターフェイスを実装していると言うことができる一般的な制約。これらは、パラメーター化された型のインスタンスで何かを行う必要があるジェネリック クラスを作成する場合に役立ちます。役に立たないように思えるかもしれません - インターフェース型をパラメーター型として使用し、ジェネリックを完全に避けるのはなぜですか? 一般的な制約により、パラメーターが複数のインターフェイスに準拠するように強制される可能性があるため、通常のパラメーター型では指定できないものです。したがって、関数を書くことができます:

public static void Frobnicate<T>(T thing)
    where T : IList<int>, IDisposable
{
    // ...
}

そこに単一の基本クラス名を貼り付けることもできます。これは、具象型を指定するよりもはるかに柔軟です。IList<int>andから継承するインターフェイスを作成することはできますが、IDisposableそれを実装するためにそこにある可能性のある使い捨ての整数のリストをすべて改造することはできません。

実行時にリフレクションを使用して検査することもできますが、この種のことは、コンパイラー IMO によってはるかに適切に処理されます。

于 2013-09-06T08:11:10.640 に答える