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

Hei*_*nzi 7 .net c# vb.net

假设我想将Double转换x为Decimal 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)
Run Code Online (Sandbox Code Playgroud)

从功能上讲,上述所有内容都做同样的事情(据我所知).除了个人品味和风格之外,还有一个特别的理由选择一种选择吗?

编辑:这是通过编译Release配置中的三个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)
Run Code Online (Sandbox Code Playgroud)

这是通过编译Release配置中的四个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)
Run Code Online (Sandbox Code Playgroud)

所以,一切都结束了 System.Decimal::.ctor(float64)

Gei*_*som 6

我怀疑使用一元转换运算符会给编译器一个更好的优化机会,但我绝对没有基础.


Sed*_*glu 4

Convert.ToInt32()对实数进行舍入,而转换为 int 只是删除小数部分。在我看来,“转换”的类型转换方法过于依赖 .NET 框架的魔力。如果您知道必须进行转换,那么明确地描述它是最容易理解的。在大多数情况下,我都会选择Convert选项,除非不需要转换并且强制转换就可以了。