public T GetMyClass <t>()其中T:MyClass,new(){/ *这是没有意义的? * /} </t>

时间:2011-07-14 14:25:28

标签: c# .net generics activator

是“Confused”类中的两个方法,在同一个下面?

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,但除了混淆同事之外,是否有理由编写除“直接”版本以外的通用版本:)

8 个答案:

答案 0 :(得分:4)

如果编写通用版本,则可以实例化并返回派生类:

where T : MyClass

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

return new T();

这是因为您已指定:

where T : new()

强制执行公共无参数构造函数的通用约束。

答案 1 :(得分:2)

当然有区别。假设你有一个派生自MyClass的第二个类:

class MyClass2 : MyClass { }

然后你可以做

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

你不能用其他功能做到这一点。

答案 2 :(得分:1)

MyClass可以是基类(或接口IMyClass)。带约束的通用版本表示您希望此函数适用于从(或实现)公共库或接口派生的任何类,并将结果作为派生类返回,而不是作为基础。

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

答案 3 :(得分:1)

有一个很大的不同:
非通用版本只能返回类型MyClass的实例,而通用版本可以返回类型MyClass的实例和从MyClass派生的所有类!

答案 4 :(得分:0)

没有。他们不一样。第一个将只构造一个MyClass对象,第二个将根据类型参数构造MyClassMyClass的后代的任何对象。

答案 5 :(得分:0)

如果您拨打.GetMyClass<MyClass>(),他们会给出相同的结果。但是,我假设已经创建了额外的方法来允许创建其他类?如果没有,那么它们是相同的,所以一个是多余的(我将摆脱通用版本,因为它在组件内部有开销)。

它们的使用方式不同吗?

答案 6 :(得分: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>());
    }
}

答案 7 :(得分:-1)

我不太确定,但Generics是.NET中的运行时功能。因此,非泛型方法不等同于通用方法,即使它被等效地使用。因为它们是公开的,所以无法进行优化。