Sub / Function array parameter altered

后端 未结 4 1705
一整个雨季
一整个雨季 2021-01-22 19:14

I have a Sub with an array of strings as parameter:

Private Sub des(ByVal array() As String)

    Dim i As Integer

    For i = 0 To UBound(array)
        array(         


        
相关标签:
4条回答
  • 2021-01-22 19:48

    Try this:

        Dim i As Integer
    
        Dim array2() As String
        array2 = array.Clone()
    
        For i = 0 To UBound(array2)
            array2(i) = "hy"
        Next
    

    The key difference is the .Clone(), that actually makes a shallow copy of array, and changing the values in array2 will no longer affect your str value in the main code.

    0 讨论(0)
  • 2021-01-22 19:58

    In Visual Basic .NET, regarding arrays as parameters, there are two important rules you have to be aware of:

    Arrays themselves can be passed as ByVal and ByRef.

    Arrays' elements can always be modified from the function or subroutine.

    You already know that you can modify the elements of an array inside a subprocess (subroutine or function), no matter how that array is defined as parameter inside that subprocess.

    So, given these two subroutines:

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

    And this very simple auxiliary subroutine (here I'll use the Console):

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

    you can do these simple tests:

    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)
    
    0 讨论(0)
  • 2021-01-22 20:02

    I read on a site that you cannot pass arrays ByVal. Is this true?

    No, that is not true.

    An array in the .NET framework is a reference type. When you create an array, an object of System.Array will be created and its reference is assigned to the reference variable.

    When you call a des method, the reference of the array object will be passed. In des method, ByVal parameter is a reference parameter variable of type System.Array, and it receive a copy of reference of an array object.

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

    0 讨论(0)
  • 2021-01-22 20:07

    Arrays are reference types. That means that when you pass an Array to your function, what is passed is always a reference, not a copy of the array. The Array in your function refers to the same array object as the Array in your calling code.

    The same thing happens when you do the assign (it is not a copy!) in your second example: all you've done is make yet another reference to the same object. That is why Boeckm's solution works -- the Clone() call does make a new array and assign it values which are copies of the values in the original array.

    0 讨论(0)
提交回复
热议问题