【问题标题】:Decimal.ToDouble Vs CType(x, Double) What is recommended/preferredDecimal.ToDouble Vs CType(x, Double) 推荐/首选什么
【发布时间】:2015-11-03 18:09:01
【问题描述】:

我的目标是将从NumericUpDown 控件返回的Decimal 转换为Double

两个都可以

MyDouble = Convert.ToDouble(MyDecimal)

MyDouble = CType(MyDecimal, Double)

或者,根据 MSDN Decimal 有一个 ToDouble 方法,所以我想:

MyDouble = MyDecimal.ToDouble

首选/推荐的方法是什么?为什么最后一个选项会给我一个未指定参数的错误?

WRT 该问题的第一部分,如果不同的转换方法应该用于不同类型的对象,是否有某个地方(最好是 MSDN)提供关于哪个对象的方法的信息/需求可以参考吗?

【问题讨论】:

  • MyDecimal.ToDouble 出现的错误是因为ToDouble 是共享方法而不是实例方法。你需要的是MyDouble = Decimal.ToDouble(MyDecimal)。我也发现各种转换方法相当令人困惑。
  • 你忘了DirectCast(MyDecimal, Double)
  • 还有CDbl(MyDecimal)
  • @MattWilko 和 JoelCoehoorn 以前没见过这些,废话!

标签: .net vb.net casting double type-conversion


【解决方案1】:

可能值得一读的是this page on MSDN(转换函数、CType、DirectCast 和 System.Convert 部分)。

您的问题的答案是“视情况而定”。例如,它在该页面上声明

生成的确切方法调用或 IL 指令取决于 对其应用转换的表达式。一些 转换被优化掉,例如被替换的 CInt(123.45) 在 IL 中使用整数常量 123。这是一个例子 使用 Visual Basic 运行时产生的性能优于 使用系统命名空间

但它最后的建议是:

建议:对于大多数转换,使用内在语言 简洁明了的转换关键字(包括 CType) 在类型之间转换时允许编译器优化。采用 DirectCast 用于将 Object 转换为 String 并用于提取值 当嵌入类型已知时,类型被装箱在 Object 变量中(即 是,强制是不必要的)。

【讨论】:

  • 马特,按照你的链接,我用过Dim d As Double = CDbl(MyNumericUpDown.Value)
【解决方案2】:

就效率而言,CType 并不是最好的。 使用 Convert.ToDouble() 更容易被接受,因为它通常更有效。

正如上面评论中提到的,.ToDouble 是一个共享方法,所以你必须去:

    Dim test As Decimal = 2.22
    Dim myDouble As Double

    myDouble = Convert.ToDouble(test)

    myDouble = Decimal.ToDouble(test)

以上任何一种方法都可以改变类型。

【讨论】:

  • 然而MSDN documentation of CType 声明“CType 是内联编译的,这意味着转换代码是评估表达式的代码的一部分。在某些情况下,代码运行得更快,因为没有过程调用来执行转换。”
  • ToDouble 和隐式转换有什么区别?他们不是都做同样的事情吗?甚至在Decimal.ToDoubleConvert.ToDouble之间?
  • CType 不是 VB6的“剩余”。您可能会将其与其他 C 混淆??? CDecCintCstr等方法。这是OP的错误方法,但您的解释不正确。
  • 所有C_() 演员实际上都是操作符而不是函数。它们只是用函数语义实现的。虽然我真的很讨厌 vb.net 中的 LEN()MID() 等 vb6 时代的函数,但运算符只是语言的一部分。
  • @Blackwood,general MSDN article 中有一些很好的花絮。我更喜欢Convert.ToXXX,但像CInt 这样的VB 在某些情况下更好(更多内联,并处理崩溃System.Convert 的情况)。
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2010-10-01
  • 2014-06-29
相关资源
最近更新 更多