array 陣列問題

vbmonk


陣列問題,
我宣告一個全域陣列iary, 執行test後,為何全域變數 iary的值會被變更
我傳入test 的引數明明是input, 且在test function中處理的變數明明是ii
為什麼iary仍會被變更?

Dim iary() As String = {"1", "2"}
Private Sub AA_Load(sender As Object, e As EventArgs) 
        Dim input() As String = iary
        Dim result As Integer = test(input)
End Sub

Function test(ByVal i() As String) As Integer
        Dim ii As Array = i
        ii(0) = "x"
        Return ii.Length
End Function



不知道是不是對陣列的觀念有誤解,再請有經驗的前輩指導一下,謝謝!
P陳
您實體的 Array 就只有一個就是 Iaray() 放的是 1 2

ii(0) = "x" <--- 請反推一下 這個的 II 的實體在那?
所以執行完後 ii(0)就會是 = "x"
P陳
等下 我再試一下
Array() 算是有容器的元件
有容器的元件,好像不會在呼叫端再產生容器
類似 DataTable 也是這樣
P陳
沒錯系統是將容器丟過去的 所以II 及I 及Iary 都是用同一個容器
1.您可以將 ii(0) = "x" 設斷點
執行前 ii(0) = "1" (0)="1" iary(0)="1"
執行完後 ii(0) = "x" (0)="X" iary(0)="x"

2. 將 Dim iary() As String = {"1", "2"} 移到 AA_Load 之內也是可以執行的
當執行到 ii(0) = "x" 是看不到 iary 的

Private Sub AA_Load(sender As Object, e As EventArgs)
Dim iary() As String = {"1", "2"}
Dim input() As String = iary
Dim result As Integer = test(input)
End Sub

Function test(ByVal i() As String) As Integer
Dim ii As Array = i
ii(0) = "x"
Return ii.Length
End Function
vbmonk
感謝P陳大大的詳細解說,
看來是我的觀念錯誤,誤以為Dim input() As String = iary 就產生一個新的array了。
所以理解成應該不會變更到最原始的array (iary)。原來我的做法都在是操作同一個array

『2. 將 Dim iary() As String = {"1", "2"} 移到 AA_Load 之內也是可以執行的
當執行到 ii(0) = "x" 是看不到 iary 的』
是指這樣改(iary變成區域變數)就不會變更到iary的內容嗎?但我實際測試還是會變更耶

因為我的設計,iary必須是全域變數(因為其他function會使用到),那我如何在呼叫test時,
不會將iary內容變動呢?
(或是根本不應該以全域變數來使用array, 也希望各位前輩分享使用array的經驗心得)

最有價值解答

P陳
個人覺得您這樣會造成程式大混亂
iary(0) 在某個地方初值是 1
在 A 中設為 X
讀回要 "1" 不能是 "X"
-----------------------------
建議的解法: (要將 A COPY 到 B 完全分開)

Function GetTest(A() As String)
Dim B() As String
Array.Copy(A, B, A.Length)
B(0) = "X" '執行後 A(0)="1" B(0)="X"
Return B.Length
End Function

COPY 那段 如果用 B=A 的話,只是容器增加而己 同還是指向同一個位置

以後如果程式變大的話,要跨表單時 您會產生另外的問題,可以直接找我討論
誰是誰
陣列是一種參考型別,參考型別的特徵在於變數的內容是物件的位址,所以雖然有三個變數 iary (欄位) , input(區域變數), I (方法參數),但這三個變數的內容完全一樣,也就是說他們通通指向同一個陣列。就這樣而已。
vbmonk
長知識了,我怎麼沒想到copy呢?
感謝各位前輩不吝分享。
回到頂部