none
[VB 2008] 關於"陣列參數傳遞"的問題 RRS feed

  • 問題

  • 以下是我想詢問的程式碼內容:
    Sub Main()
    
            Dim Ary() As Integer = {1, 2, 3}
    
            Console.WriteLine("傳值呼叫前")
    
            ShowAry(Ary)
    
            Console.WriteLine("傳值呼叫後")
    
            Call Sub1(Ary)
    
            ShowAry(Ary)
    
            Console.Read()
    
        End Sub
    
        Sub ShowAry(ByVal Array() As Integer)
    
            For i As Integer = 0 To 2
    
                Console.Write("Ary({0})={1} ", i, Array(i))
    
            Next
    
            Console.WriteLine()
    
        End Sub
    
        Sub Sub1(ByVal Array() As Integer)
    
            For i As Integer = 0 To 2
    
                Array(i) * =2
    
            Next
    
            Array = New Integer() {10, 20, 30}
    
        End Sub
    
    
    想請問一下,在sub1副程式中
    
    雖然我是使用"ByVal", 但是在Next之後的
    
    Array = New integer() {10, 20, 30}
    
    仍然屬於sub1副程式,此時的Array變數不是仍應代表著"Ary"?
    
    為何在"傳值呼叫後"執行出來的結果
    
    卻只有把原先的值乘2倍呢?
    
    
    
    小小的觀念懇請大家能幫我釐清,謝謝囉!
    那我想進階再問一下,我該怎麼判定
    "如何的副程式的情況,在ByVal下會對主程式有影響"
    如果有敘述不清還請見諒了,感激不盡!

     

    2009年5月17日 下午 04:28

解答

  • 陣列是參考型別。

    你實際宣告的陣列假設叫做 RealArray
    Ary 只是一個指標指向 RealArray
    當你在呼叫 Sub1 用 Byval 時,表示你並不是把 Ary 傳過去,而是將 Ary 這個指標變數複製成一個新的指標變數,指向同一位置傳過去,而這個新的變數在 Sub1 命名為 Array
    因此迴圈內的陣列值變化都是透過指標改變,所以 Ary 也是指標參照,當然同受影響。

    當你在 Sub1 內宣告:
    Array = New integer() {10, 20, 30}

    是產生一個新的實體陣列,而將這個陣列指標複寫 Array 這個變數。所以 Array 原先指向 RealArray 變成新位置了。
    離開副程式 Array 變數消滅,所以新的陣列實體就沒有任何變數參照,就等待空閒時消滅,但不影響 Ary 跟 RealArray。

    註:不要取容易更類別搞混的變數名
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 吉米花 2009年5月18日 下午 04:44
    2009年5月17日 下午 04:58

所有回覆

  • 陣列是參考型別。

    你實際宣告的陣列假設叫做 RealArray
    Ary 只是一個指標指向 RealArray
    當你在呼叫 Sub1 用 Byval 時,表示你並不是把 Ary 傳過去,而是將 Ary 這個指標變數複製成一個新的指標變數,指向同一位置傳過去,而這個新的變數在 Sub1 命名為 Array
    因此迴圈內的陣列值變化都是透過指標改變,所以 Ary 也是指標參照,當然同受影響。

    當你在 Sub1 內宣告:
    Array = New integer() {10, 20, 30}

    是產生一個新的實體陣列,而將這個陣列指標複寫 Array 這個變數。所以 Array 原先指向 RealArray 變成新位置了。
    離開副程式 Array 變數消滅,所以新的陣列實體就沒有任何變數參照,就等待空閒時消滅,但不影響 Ary 跟 RealArray。

    註:不要取容易更類別搞混的變數名
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 吉米花 2009年5月18日 下午 04:44
    2009年5月17日 下午 04:58
  • Dear 心冷熱情熄
    所以照這樣的意思看來,如果我並沒有在副程式中
    
    使用"New"產生一個新的實體陣列的話,其指標就是指向同一個(原先的)位置,
    
    對主程式的變數(Ary)就仍會產生影響...
    
    請問我這樣說是對的嗎? 
    
    謝謝
    2009年5月17日 下午 05:13
  • 是。

    所以 Array 類別提供了 Array.Clone / Array.Copy 兩種方法來處理陣列複製。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月18日 上午 05:44
  • Dear 心冷熱情熄
    
    嗯嗯  了解了
    謝謝你詳細的解釋 ^^
    2009年5月18日 下午 04:44