2012-02-06 135 views
2

我有一個字符串數組作爲參數子:子/功能數組參數改變

Private Sub des(ByVal array() As String) 

    Dim i As Integer 

    For i = 0 To UBound(array) 
     array(i) = "hy" 
    Next 

End Sub 

當我打電話給我的主要功能內部的功能,即使在陣列被傳遞到的STR的值變化函數ByVal:

Dim str() As String 

str = {"11111", "22222", "33333", "44444", "5555", "66666"} 

des(str) 

我試圖在Sub中製作一個數組的副本,但它仍然在主函數中更改。

Private Sub des(ByVal array() As String) 

    Dim i As Integer 

    Dim array2() As String 
    array2 = array 

    For i = 0 To UBound(array) 
     array(i) = "hy" 
    Next 

End Sub 

我在一個網站上閱讀,你不能傳遞數組ByVal。這是真的?如果是這樣,我該如何繼續?

回答

1

我在一個網站上閱讀,你不能傳遞數組ByVal。這是真的?

不,那不是真的。

在.NET框架數組是一種引用類型。當創建一個數組,將創建的System.Array對象及其引用被分配給參考變量。

當調用一個方法des,陣列對象的引用將被傳遞。在des方法,BYVAL參數是System.Array類型的參考參數變量,它接收的陣列對象的參考副本。

MSDN文章 - Passing Arguments by Value and by Reference (Visual Basic)

1

試試這個:

Dim i As Integer 

    Dim array2() As String 
    array2 = array.Clone() 

    For i = 0 To UBound(array2) 
     array2(i) = "hy" 
    Next 

的主要區別是.Clone(),這實際上使陣列的淺拷貝,並在數組2改變值將不再影響在主代碼的str值。

1

數組是引用類型。這意味着,當你傳遞一個數組給你的函數,什麼傳遞始終是一個參考,而不是數組的一個副本。在函數數組是指相同的數組對象作爲調用代碼的陣列。

當您在第二個示例中進行賦值(它是而不是副本!)時,會發生同樣的事情:您完成的所有操作都是對同一個對象進行另一次引用。這就是爲什麼Boeckm的解決方案進行的 - Clone()呼叫作出新的陣列,併爲其分配值這是原始數組中的值的副本。

1

在Visual Basic .NET,對於數組作爲參數,還有你必須要知道的兩個重要的規則:

陣列本身可以以ByVal和爲ByRef傳遞。

陣列元素總是可以從函數或子程序修改。

你已經知道,您可以修改數組的元素一個子(子例程或函數)內,無論該數組是如何被定義爲子裏面的參數。

因此,考慮到這兩個子程序:

Private Sub desval(ByVal array() As String) 
    array = {} 
End Sub 

Private Sub desref(ByRef array() As String) 
    array = {} 
End Sub 

這很簡單輔助子程序(這裏我將使用Console):

Private Sub printArr(ByVal array() As String) 
    For Each str In array 
     Console.WriteLine(str) 
    Next 
End Sub 

你可以做這些簡單的測試:

Dim arr1() as String = {"abc", "xyz", "asdf"} 

Console.WriteLine("Original array:") 
printArr(arr1) 
Console.WriteLine() 
Console.WriteLine("After desval:") 
desval(arr1) 
printArr(arr1) 
Console.WriteLine() 
Console.WriteLine("After desref:") 
desref(arr1) 
printArr(arr1)