.net Decimal.ToDouble Vs CType(x,Double)建议/首选的选项是什么
我的目标是将从.net Decimal.ToDouble Vs CType(x,Double)建议/首选的选项是什么,.net,vb.net,casting,double,type-conversion,.net,Vb.net,Casting,Double,Type Conversion,我的目标是将从NumericUpDown控件返回的Decimal转换为Double 我两者都可以用 MyDouble = Convert.ToDouble(MyDecimal) 或 或者,根据MSDNDecimal有一个ToDouble方法,所以我想: MyDouble = MyDecimal.ToDouble 首选/推荐的方法是什么?为什么最后一个选项会为未指定的参数提供错误 请注意问题的第一部分,如果不同类型的对象应该使用不同的转换方法,是否有某个地方(最好是MSDN)可以参考哪种对象/
NumericUpDown
控件返回的Decimal
转换为Double
我两者都可以用
MyDouble = Convert.ToDouble(MyDecimal)
或
或者,根据MSDNDecimal
有一个ToDouble
方法,所以我想:
MyDouble = MyDecimal.ToDouble
首选/推荐的方法是什么?为什么最后一个选项会为未指定的参数提供错误
请注意问题的第一部分,如果不同类型的对象应该使用不同的转换方法,是否有某个地方(最好是MSDN)可以参考哪种对象/要求的方法的信息?就效率而言,CType不是最好的。 使用Convert.ToDouble()更受欢迎,因为它通常效率更高 如上所述,.ToDouble是一个共享方法,因此您必须:
Dim test As Decimal = 2.22
Dim myDouble As Double
myDouble = Convert.ToDouble(test)
myDouble = Decimal.ToDouble(test)
上述任一方法都可用于更改类型。可能值得一读的是(转换函数、CType、DirectCast和System.Convert部分)
你的问题的答案是“视情况而定”。例如,它在该页上声明
生成的确切方法调用或IL指令取决于
对其应用转换的表达式。一些
转换被优化掉了,比如CInt(123.45),它被替换了
在IL中使用整数常量123。这是一个例子,其中
使用Visual Basic运行时会使性能优于
使用系统名称空间
但是,它最后的建议是:
建议:对于大多数转换,请使用内部语言
转换关键字(包括CType),以简洁明了,并
在类型之间转换时允许编译器优化。使用
DirectCast用于将对象转换为字符串和提取值
当嵌入类型已知时(即
是的,胁迫是没有必要的)
使用
MyDecimal.ToDouble
时出现的错误是因为ToDouble
是一个共享方法,而不是实例方法。您需要的是MyDouble=Decimal.ToDouble(MyDecimal)
。我也觉得各种转换方法相当令人困惑。你忘了DirectCast(MyDecimal,Double)
还有CDbl(MyDecimal)
@MattWilko&JoelCoehoorn以前从未见过这些方法,drat!然而,声明“CType是内联编译的,这意味着转换代码是计算表达式的代码的一部分。在某些情况下,代码运行得更快,因为没有调用任何过程来执行转换。”ToDouble和隐式强制转换之间有什么区别?他们不是都做同一件事吗?甚至在Decimal.ToDouble
和Convert.ToDouble
?CType
之间也不是VB6的“遗留”。你可能把它和另一个C混淆了???方法,如CDec
,Cint
,Cstr
等。这对于OP是错误的方法,但您的解释是错误的。所有C!()
强制转换实际上都是运算符而不是函数。它们只是用函数语义实现的。虽然我真的很讨厌vb.net中提供的vb6时代的函数,如LEN()
和MID()
,但操作符只是语言的一部分。@Blackwood,这本书中有一些好消息。我倾向于选择Convert.ToXXX
,但是像CInt
这样的VB在某些情况下更好(更内联,并且处理系统崩溃的情况System.Convert
)。Matt,根据你的链接,我使用了Dim d作为Double=CDbl(MyNumericUpDown.Value)
Dim test As Decimal = 2.22
Dim myDouble As Double
myDouble = Convert.ToDouble(test)
myDouble = Decimal.ToDouble(test)