2011-07-14 7 views
4

は同じクラスの下の「混乱」クラスの2つのメソッドですか?public T GetMyClass <T>()T:MyClass、new(){/ *は無意味ですか? * /}

class MyClass 
{ 
    public override string ToString() 
    { 
     return "I am confused now"; 
    } 
} 

class Confused 
{  
    public MyClass GetMyClass() 
    { 
     return new MyClass(); 
    } 

    public T GetMyClass<T>() where T : MyClass, new() 
    { 
     return System.Activator.CreateInstance<T>(); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     Confused c = new Confused(); 
     System.Console.WriteLine(c.GetMyClass()); 
     System.Console.WriteLine(c.GetMyClass<MyClass>()); 
    } 
} 

彼らは別のILを生成していますが、ジェネリックを書く場合は同僚のうちの一体を混同する以外に「まっすぐ」バージョン:)

答えて

2

確かに違いがあります。あなたはMyClassの由来第二のクラスがあるとしましょう:

class MyClass2 : MyClass { } 

その後、あなたはあなたが他の機能とそれを行うことはできません

MyClass2 myClass2 = confused.GetMyClass<MyClass2>(); 

を行うことができます。

4

以外のジェネリック版を書くためにどのような理由がありますバージョン、あなたはインスタンス化し、返す派生クラスをすることができます

where T : MyClass

をまた、ジェネリックバージョンでは、アクティベーションコードは必要ありません。

return new T();

指定したためです:

where T : new()

公共パラメータなしのコンストラクタを強制する一般的な制約を。

1

MyClassは、基本クラス(またはインターフェイスIMyClass)です。制約があるジェネリックバージョンでは、この関数を共通の基底またはインタフェースから派生した(または実装する)すべてのクラスに対して機能させ、その結果をベースではなく派生クラスとして返すようにします。

class MyClass { } 
class MySpecializedClass : MyClass { } 
// etc. 
1

非常に大きな違いがあります:
ジェネリックバージョンはタイプMyClassのインスタンスとMyClassから派生したすべてのクラスを返すことができるのに対し、非ジェネリック版のみ、タイプMyClassのインスタンスを返すことができます!

0

いいえ。同じではありません。最初のオブジェクトはMyClassオブジェクトのみを構築し、2番目のオブジェクトはtypeパラメータに基づいてMyClassまたはその子孫オブジェクトを作成します(MyClass)。

-1

わかりませんが、Genericsは.NETのランタイム機能です。したがって、非ジェネリックメソッドは、等価に使用されていても、ジェネリックメソッドと同等ではありません。公開されているので、これを最適化することはできません。

+0

私の知る限り、それらは(.NETでは)ありません。 http://stackoverflow.com/questions/6127855/why-is-this-generic-not-resolved-at-compile-time/6128454#6128454も参照してください。 –

0

.GetMyClass<MyClass>()を呼び出すと同じ結果が得られます。しかし、他のクラスの作成を可能にするために余分なメソッドが作成されていると思いますか?そうでなければ、それらは同じです。したがって、冗長です(そして、アセンブリ内のオーバーヘッドがあるのでジェネリック版を取り除きます)。

別々に使用されていますか?

0

これらは同じではありません。ジェネリックでは継承されたクラスも以下のように構築できます。

class MyClass 
{ 
    public override string ToString() 
    { 
     return "I am confused now"; 
    } 
} 

class InheritedClass : MyClass 
{ 
} 

class Confused 
{ 
    public MyClass GetMyClass() 
    { 
     return new MyClass(); 
    } 

    public T GetMyClass<T>() where T : MyClass, new() 
    { 
     return System.Activator.CreateInstance<T>(); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     Confused c = new Confused(); 
     System.Console.WriteLine(c.GetMyClass()); 
     System.Console.WriteLine(c.GetMyClass<MyClass>()); 
     System.Console.WriteLine(c.GetMyClass<InheritedClass>()); 
    } 
} 
関連する問題