使用
之间是否有任何重大差异 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>
答案 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代码体。)