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

时间:2015-04-07 12:11:19

标签: c# .net base-class-library

Convert.ToInt32的重载需要Int32作为参数。但即使documentation says that basically nothing happens和方法也会返回其输入。

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

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

5 个答案:

答案 0 :(得分:18)

我的想法:

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

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

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

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

答案 1 :(得分:5)

只有API设计者知道。

如果我不得不猜测,我猜它是为了保持一致性 - 例如,当你使用反射来动态创建调用时,如果你可以假设每个{{}任何基本类型Convert.ToX(Y)X都存在{1}}组合。

答案 2 :(得分:1)

我们可以从框架类中的ToInt32(Int32)的用法中得出一个可能的答案。

E.g。 System.Activities.DurableInstancing.SerializationUtilities

public static byte[] CreateKeyBinaryBlob(List<CorrelationKey>correlationKeys)
{
     [...]
     Convert.ToInt32(correlationKey.BinaryData.Count)

和 System.ComponentModel.Design.CollectionEditor

private void PaintArrow(Graphics g, Rectangle dropDownRect)
{
    Point point = new Point(Convert.ToInt32(dropDownRect.Left + dropDownRect.Width / 2), Convert.ToInt32(dropDownRect.Top + dropDownRect.Height / 2));

在这两种情况下,我们都可以看到属性或表达式的类型当前是Int32,但是在不同的平台,CPU架构,框架的未来版本上,/可能/该类型可能有所不同是合理的期望等

所以我提出的答案是,它作为源代码的未来证明存在,即使在一些关键的实体&#39; (例如窗口X和Y坐标)改变类型。

答案 3 :(得分:0)

公共语言运行时在内部使用IConvertible接口。 由于CLR基类型是布尔值,SByte,Byte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal,DateTime,Char y String,因此Convert类中的每一个都有一个实现。< / p>

但是,例如,Convert.toBoolean(DateTime)总是按设计返回Exception。

答案 4 :(得分:0)

以下是方法说明:

    //
    // Summary:
    //     Returns the specified 32-bit signed integer; no actual conversion is performed.
    //
    // Parameters:
    //   value:
    //     The 32-bit signed integer to return.
    //
    // Returns:
    //     value is returned unchanged.

我唯一能想到的是,如果输入已经是int,它就是快捷方式/传递方式。它可能比将int传递到Convert.ToInt32(object)更有效。