隐含的VB性能问题

时间:2009-12-12 23:26:56

标签: vb.net casting performance implicit directcast

有时我必须实现一个接口或继承一个基本方法期望一个对象的虚拟(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:知道类型时的铸造,但感觉更安全。

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

2 个答案:

答案 0 :(得分:2)

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

Dim x As Integer = DirectCast(obj, Integer)

当严格模式关闭时,您只能执行从Object到Integer的隐式转换。你应该打开严格模式,这样你就可以确定你没有错误地进行任何隐式转换。当你打开严格模式时,你必须进行显式转换才能编译代码。

答案 1 :(得分:1)

您的选项1 仍然正在投射 - 实际上,它正在做更多的事情,它正在执行转换。例如,如果obj是字符串“1”,则选项1将其转换为整数1,而选项2将因InvalidCastException而失败。 (在过去的好日子里,这被称为“邪恶类型强制”,这听起来比隐性转换更酷,但也强调了这种方法可能掩盖错误并导致意外行为的潜在危险。)

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

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