Convert.ToInt32
的重载需要Int32
作为参数。但即使documentation says that basically nothing happens和方法也会返回其输入。
问题是为什么我们有这样的超负荷?有什么目的吗?谁能给我一个使用这种方法的例子?
我的想法 :我想我们可能有它,因为有一个重载需要Object。因此我们想要消除拳击等。但我不确定。
答案 0 :(得分:18)
我的想法:
Convert.ToInt32(Int32)
之类的重载简化了代码生成器,但不会妨碍运行时性能,因为调用可能会立即被JIT消失代码生成(更多详情): 在.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)
更有效。