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

使用之间有什么重大区别吗?

 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>
最佳答案
在这种情况下,没有区别.泛型用于传递类型信息.只要您想调用其他代码,或者返回一个值,并且该值必须静态输入与输入参数bc相同,您需要泛型.

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

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

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

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

转载注明原文:c# – 使用抽象类作为方法参数和约束到所述抽象类的泛型参数之间是否有任何明显的区别? - 代码日志