c# - 使用抽象类作为方法参数和将泛型参数限制到所述抽象类之间有什么明显的区别吗?

标签 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>

最佳答案

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

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

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

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

您说您在测试期间没有发现任何差异。这是有道理的,因为 JIT 删除了通用类型信息(大部分)。两种变体的 JITed 代码看起来非常相似。泛型引用的虚拟调用与非泛型 v 调用的实现方式相同。 (请注意,这仅适用于引用类型。所有引用类型共享一个 JIT 代码体。)

关于c# - 使用抽象类作为方法参数和将泛型参数限制到所述抽象类之间有什么明显的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20803588/

相关文章:

c# - 查询 x64-GAC

c# - c# string 如何计算它自己的值?

.net - 性能计数器不正确地递增?

vb.net - LINQ:排序依据(将字母视为数字)

sql - SQL 中的 2x 1 到(零或 1)关系

.net - GetLastWriteTime 不准确

c# - GroupBy() 之后展平 IQueryable<T> 时出错

c# - Xamarin Forms App 链接使用参数

c# - 在 C# 中执行 Redis 控制台命令

c# - 多个使用 block c#