0

有时我必须实现一个接口或继承一个基本方法需要一个对象的虚拟(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:在类型已知但感觉更安全的情况下进行投射。

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

4

2 回答 2

2

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

Dim x As Integer = DirectCast(obj, Integer)

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

于 2009-12-12T23:46:01.563 回答
1

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

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

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

于 2009-12-12T23:46:22.840 回答