使用抽象类作为方法参数和约束到所述抽象类的泛型参数之间是否有任何明显的区别?

时间:2013-12-27 15:52:30

标签: c# .net vb.net generics abstract-class

使用

之间是否有任何重大差异
 public TValue SomeFunctionA<TValue>(BaseClass<TValue> bc)

 public TValue SomeFunctionB<TValue, TBaseClass>(TBaseClass bc)
      where TBaseClass : BaseClass<TValue>

我做了一些测试,我似乎找不到任何区别。所有派生类的行为都应该如此(覆盖某些东西,新东西等)。

如果知道'TValue'是什么,例如(除了现在你可以使用运算符):

 public int SomeFunctionAInt(BaseClass<int> bc)

 public int SomeFunctionBInt<TBaseClass>(TBaseClass bc)
      where TBaseClass : BaseClass<int>

1 个答案:

答案 0 :(得分:3)

在这种情况下没有区别。泛型用于传递类型信息。只要您想调用其他代码,或者返回一个值,并且该值必须静态输入与输入参数bc相同,您就需要泛型。

例如,下面的两个函数输出相同的内容,但第二个保留类型信息:

object PrintAndReturn1(object obj) { Console.WriteLine(obj); return obj; }
T PrintAndReturn2<T>(T obj) { Console.WriteLine(obj); return obj; }

当您想保留类型信息时,泛型会发挥作用。如果您只是使用一个值而不传递它,继承就足够了。

你说你在测试过程中没有发现任何差异。这是有道理的,因为JIT会删除泛型类型信息(主要是)。两种变体的JITed代码看起来非常相似。对泛型类型的引用的虚拟调用以与非泛型v调用相同的方式实现。 (注意,这只适用于引用类型。所有引用类型共享一个JITed代码体。)