假设我想将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)
从功能上讲,以上所有内容都做同样的事情(据我所知)。除了个人品味和风格之外,还有一个特别的理由选择一种选择吗?
编辑:这是通过编译发布配置中的三个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)
这是通过编译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)
所以,这一切都以System.Decimal::.ctor(float64)
答案 0 :(得分:6)
我怀疑使用一元转换运算符会给编译器一个更好的优化机会,但我绝对没有基础。
答案 1 :(得分:4)
Convert.ToInt32()
将舍入应用于实数,而转换为int只是删除小数部分。在我看来,“转换”的类型转换方法依赖于.NET框架的魔力太多了。如果您知道必须进行转换,那么明确地描述它是最容易理解的。对于大多数情况,我会选择Convert
选项,除非不需要转换并且演员阵容正常工作。
答案 2 :(得分:1)
对于非对象和非字符串源数据类型,我更喜欢强制转换。简洁易读。
对于对象和字符串源类型,它取决于源。例如,如果源来自用户,那么我使用转换/转换方法。
我建议在“Microsoft参考源代码中心”(http://referencesource.microsoft.com)下载.NET的源代码。查看Convert.cs,Converstion.vb和Conversions.vb。我以前会在所有情况下使用转换/转换方法,但在查看这些源文件后,我的偏好是强制转换。
以你的例子Convert.ToDecimal()
为例,并引用Convert.cs,这个调用实际上是一个简单的演员:
public static decimal ToDecimal(double value) {
return (decimal)value;
}