是“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,但除了混淆同事之外,是否有理由编写除“直接”版本以外的通用版本:)
答案 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
对象,第二个将根据类型参数构造MyClass
或MyClass
的后代的任何对象。
答案 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中的运行时功能。因此,非泛型方法不等同于通用方法,即使它被等效地使用。因为它们是公开的,所以无法进行优化。