繁体   English   中英

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

[英]Why does Convert.ToInt32(Int32) exist?

Convert.ToInt32有一个重载,以Int32作为参数。 但即使文档说基本没有任何反应 ,该方法返回其输入。

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

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

我的想法:

  • 对于代码生成 :特别是在.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因为调用方法的开销会比方法体高得多。

只有API设计者知道。

如果我不得不猜测,我猜它是为了保持一致性 - 例如,当您使用反射动态创建调用时,如果您可以假设每个Convert.ToX(Y)组合存在,则会更容易对于任何原始类型XY

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

例如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架构,框架的未来版本等上可能不同。

所以我提出的答案是,它作为源代码的未来证明存在,即使在某些关键“实体”(例如窗口X和Y坐标)改变类型时也允许编译而无需修改。

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

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

这是方法描述:

    //
    // 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)更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM