2009-12-12 48 views
0

有时我必须实现一个接口或继承基本方法期望的对象的虚拟(MustInherit),而我知道我将通过的值将总是总是是一个整数例如。隐含的VB性能问题

什么应该从下面的例子中的最佳性能:

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,什么会花费更多的性能。

+0

如果您声称实施该界面,则应该准备好接受任何对象。否则,你并没有真正实现接口。 – 2009-12-12 23:31:07

+0

同样,我说接口的东西只是一个理由来提出我的问题。 – Shimmy 2009-12-12 23:59:26

+0

而一个实际的例子是当你重写一个类,并将其标记为NotInheritable(密封)。 另一个很好的例子是当你实现IValueConversion时。 – Shimmy 2009-12-13 00:00:38

回答

1

您的选择1 仍在铸造 - 事实上,它做的不止于此,它正在进行转换。例如,如果obj是字符串“1”,则选项1会将其转换为整数1,而选项2将因InvalidCastException而失败。 (在过去的美好时光中,这被称为“邪恶类型强制”,这听起来比隐式转换更酷,但也强调了这种方法可能掩盖错误并导致意外行为的潜在危险。)

因此,Option 1可能会略微减少,因为它可以做更多的工作(转换而不是普通的老式转换)。但是如果你只是传入整数,差异可能是微不足道的。一如既往,如果表现真的很重要,措施

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

+0

不要忘记,我标记了我的问题隐式,一个(不记录)VB甚至不会失败Dim x As Integer =“5”,这是很酷的(或为其他人 - 不酷)关于VB的东西。 – Shimmy 2009-12-12 23:58:27

2

您在第一个选项中所做的是隐式转换。编译器为您创建一个明确的转换,所以你实际上得到的是仍然类似于:

Dim x As Integer = DirectCast(obj, Integer) 

当严格模式已关闭,只能做从对象到整数隐式转换。您应该打开严格模式,以确保您不会错误地进行任何隐式投射。当你打开严格模式时,你将不得不为显示的代码进行编译。

+1

非严格隐式强制转换与DirectCast并不完全相同 - 它采用VB6风格的恶意类型强制转换。 – itowlson 2009-12-12 23:48:33

+0

@itowlson:好点。我改变了文字,以免它意味着确切的等同。 – Guffa 2009-12-12 23:57:18