转换数值类型:使用哪种样式

本文关键字:样式 类型 转换 | 更新日期: 2023-09-27 18:10:34

假设我想将双精度x转换为十进制y。有很多方法可以做到这一点:

1. var y = Convert.ToDecimal(x);    // Dim y = Convert.ToDecimal(x)
2. var y = new Decimal(x);          // Dim y = new Decimal(x)
3. var y = (decimal)x;              // Dim y = CType(x, Decimal)
4. -- no C# equivalent --           // Dim y = CDec(x)

从功能上讲,上述所有方法都做同样的事情(据我所知)。除了个人品味和风格之外,还有什么特别的原因让你选择其中一种吗?

EDIT:这是在发布配置中编译三个c#选项生成的IL:

1. call valuetype [mscorlib]System.Decimal [mscorlib]System.Convert::ToDecimal(float64)
   --> which calls System.Decimal::op_Explicit(float64)
       --> which calls System.Decimal::.ctor(float64)
2. newobj instance void [mscorlib]System.Decimal::.ctor(float64)
3. call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Explicit(float64)
   --> which calls System.Decimal::.ctor(float64)

这是在发布配置中编译四个VB选项生成的IL:

1. call valuetype [mscorlib]System.Decimal [mscorlib]System.Convert::ToDecimal(float64)
   --> which calls System.Decimal::op_Explicit(float64)
       --> which calls System.Decimal::.ctor(float64)
2. call instance void [mscorlib]System.Decimal::.ctor(float64)  
3. newobj instance void [mscorlib]System.Decimal::.ctor(float64)
4. newobj instance void [mscorlib]System.Decimal::.ctor(float64)

最后是System.Decimal::.ctor(float64)

转换数值类型:使用哪种样式

我怀疑使用一元强制转换操作符会给编译器一个更好的优化机会,但我完全没有根据。

Convert.ToInt32()对实数四舍五入,而将其转换为int只删除小数部分。在我看来,"转换"的类型转换方法过于依赖于。net框架的魔力。如果您知道必须进行转换,那么显式地描述它是最容易理解的。在大多数情况下,我会选择Convert选项,除非不需要转换,并且强制转换刚好有效。

对于非对象和非字符串源数据类型,我更喜欢强制类型转换。简洁易读。

对于对象和字符串源类型,它取决于源。例如,如果源来自用户,那么我使用Convert/Conversion方法。

我建议从"Microsoft参考源代码中心"(http://referencesource.microsoft.com)下载。net的源代码。查看converts .cs、converts .vb和converts .vb。我以前在所有情况下都会使用Convert/Conversion方法,但是在检查了这些源文件之后,我更喜欢使用强制类型转换。

以您的示例Convert.ToDecimal()和引用Convert.cs为例,调用实际上是一个简单的强制转换:

    public static decimal ToDecimal(double value) { 
        return (decimal)value;
    }