也許這是 Visual Studio 2022(當前版本)中的一個錯誤......但根據我到目前為止對 ByVal 與 ByRef 的了解以及此檔案:
https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/passing-arguments-by-value-and-by-reference#:~:text=The advantage of passing an,正在 changed by the procedure。
... 如果基礎元素是可修改的,但您不希望程序能夠更改其值,請宣告引數 ByVal。只有呼叫代碼才能更改按值傳遞的可修改元素的值。...
我希望這段代碼:
Friend Sub Driver()
Dim index As Integer = 5
Dim OneDimensionalMatrix(index) As Integer
For x As Integer = 0 To index - 1
OneDimensionalMatrix(x) = 44
Next
SubRoutine(index, OneDimensionalMatrix)
Console.WriteLine(index)
Console.WriteLine(OneDimensionalMatrix(3))
End Sub
Public Sub SubRoutine(ByVal matrixSize As Integer, ByVal OneDimensionalMatrix() As Integer)
For x As Integer = 0 To matrixSize - 1
OneDimensionalMatrix(x) = 55
Next
matrixSize = 100
End Sub
將生成以下輸出:
5
44
但它正在生成以下輸出:
5
55
對我來說,這意味著 OneDimensionalMatrix 的 ByVal 正在處理,就好像它是 ByRef 宣告一樣。
我是否遺漏了什么,或者這是 VS 2022 中的錯誤?
uj5u.com熱心網友回復:
以下是通過值或參考傳遞的非常簡單的規則:
- 通過值傳遞值型別(結構)時,無論是修改物件還是分配新物件都不會影響原始變數。
- 通過參考傳遞值型別時,修改物件和分配新物件都會影響原始變數。
- 通過值傳遞參考型別(類)時,修改物件會影響原始變數,但分配新物件不會。
- 當通過參考傳遞參考型別時,修改物件和分配新物件都會影響原始變數。
如果不修改影響原始變數的物件,就無法傳遞參考型別物件。如果這是您想要的,那么您可以明確地創建物件的副本并將其傳遞給方法。
按值傳遞方法引數就像分配給另一個變數一樣。它創建原始變數內容的副本。如果該內容是一個值,則復制該值,如果該內容是參考,則復制該參考。如果您復制參考,那么您對同一個物件有兩個參考,而不是兩個物件。您希望在這里輸出什么:
Dim arr1 = {1, 2, 3}
Dim arr2 = arr1
arr2(1) = 5
Console.WriteLine(arr1(1))
希望您說“5”,因為希望您意識到這兩者arr1并arr2參考同一個陣列物件。當您將陣列(或任何參考型別物件)按值傳遞給方法時,情況也是如此。
這種行為正是ByValVB.NET 中的默認值在ByRefVB6 中的原因。在 VB6 中,默認情況下會復制大物件,因此您必須通過參考傳遞以避免這種情況。在 VB.NET 中,默認情況下不會復制大物件,因此您只通過參考傳遞,因為您實際上想要傳遞與傳入不同的物件。默認情況下復制值型別的事實是主要原因之一值型別應該永遠很小。我認為建議不大于 32 個位元組,即最多 8 個欄位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/459310.html
