[英]Why does Convert.ToInt32(Int32) exist?
Convert.ToInt32
有一个重载,以Int32
作为参数。 但即使文档说基本没有任何反应 ,该方法返回其输入。
问题是为什么我们有这样的超负荷? 有什么目的吗? 谁能给我一个使用这种方法的例子?
我的想法 :我认为我们可能有它,因为有一个重载需要Object。 因此我们想要消除拳击等。 但我不确定。
我的想法:
Convert.ToInt32(Int32)
这样的重载简化了代码生成器,但不会妨碍运行时性能,因为调用可能会立即被JIT消除 代码生成(更多细节):在.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)
组合存在,则会更容易对于任何原始类型X
和Y
我们可以从框架类中的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.