[英]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,它是MyClass
或MyClass
的后代,基于类型参数。
仅当您调用.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.