为什么Convert.ToInt32(Int32)存在?

Ale*_*nda 25 .net c# base-class-library

有过载Convert.ToInt32的是采用Int32作为参数.但即使文档说基本没有任何反应,该方法返回其输入.

问题是为什么我们有这样的超负荷?有什么目的吗?谁能给我一个使用这种方法的例子?

我的想法:我认为我们可能拥有它,因为有一个重载需要Object.因此我们想要消除拳击等.但我不确定.

Geo*_*org 18

我的想法:

  • 对于代码生成:特别是在.NET 2.0中,生成了许多代码,例如类型化数据集.像过载一样Convert.ToInt32(Int32)简化代码生成器但不会妨碍运行时性能,因为调用可能会立即被JIT消除
  • 为了保持一致性:自2.0以来,.NET中存在IConvertible接口,甚至可能是自Convert类使用的1.0以来.此接口需要ToInt32等方法.

代码生成(更多细节): 在.NET 2.0中生成代码的常用方法是System.CodeDOM,因为它提供了为多种语言重用相同代码生成器的方法,最突出的是VB.NET和C#.在CodeDOM中,您不需要知道给定表达式调用方法的类型,您只需创建一个给定目标对象表达式和方法名称的CodeMethodCallExpression.另一方面,CodeDOM不支持许多类似C#s的运算符作为运算符.

因此,通常很难知道CodeDOM中给定代码表达式的类型.这完全有意义,因为表达式可能涉及的许多方法也是生成代码的一部分,因此在生成时未知.但是,在某些情况下,您需要将特定表达式转换为给定类型,例如System.Int32.我可以想象这实际上发生在类型数据集上,尽管我不是100%肯定.因为Convert.ToInt32存在,所以生成器不需要知道给定表达式是否是类型System.Int32.当编译器编译生成的代码时,所有方法签名都可用,编译器可能会发现表达式的类型是System.Int32并调用适当的重载.

另一方面,JIT编译器将检测该方法Convert.ToInt32将仅返回其参数.但由于该方法不是虚拟的,因此可以将方法体插入调用者代码而不是调用,Convert.ToInt32因为调用方法的开销会比方法体高得多.


The*_*kis 5

只有API设计者知道.

如果我不得不作出一个猜测,我想这是出于一致性的缘故-例如,当您使用反射动态创建调用,它更容易,如果你可以让每个假设Convert.ToX(Y)组合存在任何基本类型XY.