【问题标题】:Implicit VB performance question隐式 VB 性能问题
【发布时间】:2009-12-13 07:53:26
【问题描述】:

有时我必须实现一个接口或继承一个基本方法需要一个对象的虚拟 (MustInherit),而我知道我将传递的值将始终是一个整数。

以下示例的最佳性能应该是什么:

Public Sub DoSomething(ByVal obj As Object)
    'option 1:
    Dim x As Integer = obj

    'option 2:
    Dim y = DirectCast(obj, Integer)
End Function

注意事项:

  • 选项 1:不进行强制转换,但可能不太合适,是否会降低性能?
  • 选项 2:在类型已知但感觉更安全的情况下进行转换。

注意:请不要评论“你为什么不想以不同的方式实现它”等等。 我的问题不是如何做到这一点,我没有找到如何问的例子,我的问题是什么选项应该是正确的,什么会花费更多的性能。

【问题讨论】:

  • 如果你声称实现了接口,那么你应该准备好接受任何对象。否则,您并没有真正实现接口。
  • 再次,我说界面的事情只是我提出问题的一个理由。
  • 一个实际的例子是当你重写一个类并将它标记为 NotInheritable(密封)。另一个很好的例子是当你实现 IValueConversion 时。

标签: vb.net casting performance implicit directcast


【解决方案1】:

您在第一个选项中所做的是隐式转换。编译器会为您创建一个显式转换,因此您实际得到的仍然类似于:

Dim x As Integer = DirectCast(obj, Integer)

您只能在严格模式关闭时执行从 Object 到 Integer 的隐式转换。您应该打开严格模式,以确保您不会错误地执行任何隐式转换。开启严格模式后,您必须进行显式强制转换才能编译代码。

【讨论】:

  • 非严格隐式强制转换与 DirectCast 不太一样——它执行 VB6 风格的 Evil Type Coercion。
  • @itowlson:好点。我更改了文本,因此它并不意味着完全等价。
【解决方案2】:

您的选项 1 仍在投射 - 事实上,它的作用不止于此,它正在执行转换。例如,如果 obj 是字符串“1”,选项 1 会将其转换为整数 1,而选项 2 将失败并返回 InvalidCastException。 (在过去,这被称为“邪恶类型强制”,这听起来比隐式转换要酷得多,但也凸显了这种方法可能会掩盖错误并导致意外行为的潜在危险。)

所以选项 1 的性能可能会稍微较少,因为它做了更多的工作(转换而不是普通的旧演员表)。但是,如果您只传递整数,则差异可能微不足道。与往常一样,如果性能真的很重要,衡量

可能比性能更重要的考虑因素是所需的行为。例如。如果有人传入字符串“1”,您是否希望它像传入整数 1 一样工作?如果是这样,请选择选项 1。如果您希望在这种情况下失败,请选择选项 2。

【讨论】:

  • 别忘了我将我的问题标记为“隐式”,即使您执行 Dim x As Integer = "5",(不公开的)VB 也不会失败,这很酷(或其他人 - 不酷)关于 VB 的事情。
猜你喜欢
  • 2021-07-18
  • 2011-05-21
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多