簡體   English   中英

公共 T GetMyClass<t> () where T: MyClass, new() { /* 這沒有意義嗎? */ }</t>

[英]public T GetMyClass<T>() where T : MyClass, new() { /* is this pointless? */ }

下面class“困惑”中的兩種方法是否相同?

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,但是除了混淆同事之外,還有什么理由編寫通用版本而不是“直截了當”的版本:)

如果編寫泛型版本,則可以實例化並返回派生類:

where T: MyClass

此外,使用通用版本,您不需要激活碼:

return new T();

這是因為您已指定:

where T: new()

強制執行公共無參數構造函數的通用約束。

當然有區別。 假設您有第二個來自 MyClass 的 class:

class MyClass2 : MyClass { }

然后你可以做

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

你不能用其他 function 做到這一點。

MyClass可以是基礎 class (或接口IMyClass )。 具有約束的通用版本表示您希望此 function 適用於從(或實現)公共基礎或接口派生的任何 class,並將結果作為派生的 class 返回,而不是作為基礎。

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

有一個非常大的區別:
非泛型版本只能返回MyClass類型的實例,而泛型版本可以返回MyClass類型的實例以及從MyClass派生的所有類!

不,它們不一樣。 第一個將只構造一個MyClass object,第二個將構造任何 object,它是MyClassMyClass的后代,基於類型參數。

僅當您調用.GetMyClass<MyClass>()時,它們才會給出相同的結果。 但是,我認為已經創建了額外的方法以允許創建其他類? 如果不是,那么它們是相同的,所以一個是多余的(我會擺脫通用版本,因為在程序集中有開銷)。

它們的使用方式不同嗎?

他們不一樣。 泛型允許像這樣構建繼承的類:

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>());
    }
}

我不太確定,但 Generics 是 .NET 中的運行時功能。 因此,非泛型方法並不等同於泛型方法,即使它被等效使用。 由於它們是公開的,因此無法對其進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM