3

一部の既存のコードでは、次のように表示されます。

public abstract class BasicComponent<T> : IBasicComponent<T> 
                                          where T : class, new()

抽象クラスとインターフェースが何であるかを知っています。しかし、それは何をしていてwhere T、拡張するclassとどうなりnew()ますか?

4

5 に答える 5

12

これらはジェネリック型の制約です。

使用classする手段はT、クラス (インターフェイス、デリゲート、および配列を含む) であるnew必要があり、パラメーターのないパブリック コンストラクターが必要です。

リンクされた MSDN ドキュメントから:

where T : class - 型引数は参照型でなければなりません。これは、任意のクラス、インターフェイス、デリゲート、または配列型にも適用されます。

where T : new() - 型引数には、パラメーターなしのパブリック コンストラクターが必要です。他の制約と一緒に使用する場合、 new() 制約は最後に指定する必要があります。

于 2012-08-31T11:37:48.053 に答える
1

Whereジェネリック型パラメーターの制約を宣言するために使用されます。これは、コンパイラーが型パラメーターについて十分に認識していないために、他の方法では許可できなかったいくつかのことを許可できることを意味します。

where T : class;

Tclassこれは、型パラメーターを a に制限します。これは、このメソッドがclass値型または構造体としてではなく、としてのみ受け入れることを意味します。

where T : new();

Tこれにより、型パラメーターは、パラメーターなしのコンストラクターが定義されている型に制限されます。したがって、コンパイラは次のものを受け入れることができます。

T t = new T();
于 2012-08-31T11:39:56.460 に答える
1

where Tジェネリック型 T を制限します

classT がクラスである必要があり、構造体または値の型がないことを
new意味します。これは、T がパラメーターなしのコンストラクターを持たなければならないことを意味します

于 2012-08-31T11:38:30.947 に答える
1

T参照型 ( ) である必要がclassあり、パラメーターなしのコンストラクターが必要new()です。

これは、BasicComponent<T>およびそれから派生したクラスが、そのようなコンテキストでのみ実行できることを実行できることを意味します。それはまた、そうでなければ無意味なことをすることができることを意味します。逆に言えば、持っていない場合です。

public abstract class BasicComponent<T>
{
  public T Build()
  {
    return new T();//can't do this without `new()` constraint.
  }
  public bool Check(T item)
  {
    return item != null;//only references types can be null, so 
                        //can't do this without `class` constraint
                        //though notice that `default(T)` works for
                        //both reference and value types.
  }
  public bool IsSame(T x, T y)
  {
    return ReferenceEquals(x, y);//pointless with value-types.
                                 //x and y would be passed to IsSame by
                                 //copying, then boxed to two different objects
                                 //then this will always return false.
                                 //as part of a generic implementation that
                                 //accepted both value and reference types
                                 //it might be that we still care to do something
                                 //for reference-equals, in other cases the 
                                 //pointlessness would make the whole class pointless
                                 //for value types.
  }
  public abstract void Whatever();//just added in so the class still does something abstractly!
}

から派生したクラスはBasicComponent<T>、少なくとも同じくらい厳密でなければならないことに注意してくださいBasicComponent<T>。それには、独自の制約をさらに追加する場合と追加しない場合があるすべての制約が必要です。

于 2012-08-31T11:48:16.873 に答える
0

T は、使用する一般的な部分です。
キーワードはフィルターのように機能します (他の言語と同様)

ここでは、クラスと new() を使用しました

つまり、
このジェネリック クラスに渡される任意のクラスを使用できます。
new() は、クラスにパラメーターのないコンストラクターがあることを伝えていることを意味します。

于 2012-08-31T11:42:12.143 に答える