2012-02-09 71 views
28

我剛安裝了Visual Studio 2010的服務包(Windows Update上提出的),我可以看到的「智能感知」,這意味着一個新的功能,當我在寫一個VB.NET或FunctionSub不會自動完成參數與ByRefByVal ...爲什麼沒有必要指出ByVal/ByRef了?

1)有無論如何,我可以配置這個選項回到它以前是怎麼回事?

2)如果我不指定ByX,默認使用哪一個? (好像總是ByRef

+2

默認是'ByVal',但一定要理解什麼[按價值計算,通過引用傳遞(http://msdn.microsoft.com/en-us/library/ddck1z30.aspx)實際上意味着。 – 2012-02-09 08:50:57

+9

你幾乎總是想通過'ByVal',而這實際上是默認的。沒有任何理由讓代碼與遍佈全國的'ByVal'混雜在一起;這只是「噪音」。只有在絕對必須具有傳遞引用語義時才明確指定'ByRef'。 – 2012-02-09 08:51:34

回答

17

蒂姆覆蓋你直接問,但別的東西要記住的是,任何引用類型變量,如用戶定義的類甚至如果按值傳遞將允許您更改該實例屬性等。但它不會允許您更改整個對象。這可能是爲什麼它似乎你引用

Public Sub (Something As WhateverClass) 
    Something = New WhateverClass 'will result in no changes when outside this method 

    Something.Property1 = "Test" 'will result in an updated property when outside this method 
End Sub 

被默認爲從MSDN

引用類型的值是一個指向內存的其他地方的數據。 這意味着,當按值傳遞引用類型, 程序代碼有一個指針指向的底層元素的數據, 即使它不能訪問基礎元件本身。對於 例如,如果元件是一個數組變量,程序代碼並 不能訪問變量本身,但它可以訪問該陣列 成員。

+0

這個答案有點誤導性,因爲它解釋了「引用類型的值如何工作」,而問題是「爲什麼沒有必要再指明ByVal/ByRef?」 – mchar 2017-06-05 11:20:36

31

看來,這個職位涵蓋了你的問題:

http://msmvps.com/blogs/carlosq/archive/2011/03/15/vs-2010-sp1-changing-quot-byval-quot-vb-net-code-editor-experience.aspx

因此,沒有,有沒有辦法讓舊的行爲。從現在開始,ByVal是默認值(之前的值),它不會自動添加到方法參數中。

在我看來,這是一個很好的決定,因爲它使VB.NET多一點與C#一致,避免了不必要的「噪音」(它已經足夠詳細)。

舊行爲:

Private Sub test(ByVal test As String) 
End Sub 

新行爲

Private Sub test(test As String) 
End Sub 
+0

簡潔直接的答案,做得好! – mchar 2017-06-05 11:22:25

8

轉移例程VBA中默認爲ByRef時當心(見例如,「默認的方法傳遞參數的」在the bottom of this page,由偉大的芯片皮爾遜)。 這可能是凌亂的。

相關問題