2009-12-12 50 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