台灣最大程式設計社群網站
線上人數
1603
 
會員總數:246502
討論主題:190009
歡迎您免費加入會員
討論區列表 >> VB.NET >> array 陣列問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
array 陣列問題
價值 : 200 QP  點閱數:215 回應數:7
樓主

vbmonk
門外漢
0 15
452 41
發送站內信



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




不知道是不是對陣列的觀念有誤解,再請有經驗的前輩指導一下,謝謝!

搜尋相關Tags的文章: [ array ] , [ vb.net ] , [ c# ] ,
本篇文章發表於2021-10-05 14:56
1樓
回應

P陳
檢舉此回應
您實體的 Array 就只有一個就是 Iaray() 放的是 1 2

ii(0) = "x" <--- 請反推一下 這個的 II 的實體在那?
所以執行完後 ii(0)就會是 = "x"
本篇文章回覆於2021-10-06 08:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

P陳
檢舉此回應
等下 我再試一下
Array() 算是有容器的元件
有容器的元件,好像不會在呼叫端再產生容器
類似 DataTable 也是這樣
本篇文章回覆於2021-10-06 08:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

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
本篇文章回覆於2021-10-06 08:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

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的經驗心得)
本篇文章回覆於2021-10-06 11:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

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 的話,只是容器增加而己 同還是指向同一個位置

以後如果程式變大的話,要跨表單時 您會產生另外的問題,可以直接找我討論
本篇文章回覆於2021-10-06 16:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

誰是誰
檢舉此回應
陣列是一種參考型別,參考型別的特徵在於變數的內容是物件的位址,所以雖然有三個變數 iary (欄位) , input(區域變數), I (方法參數),但這三個變數的內容完全一樣,也就是說他們通通指向同一個陣列。就這樣而已。
本篇文章回覆於2021-10-07 22:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

vbmonk
檢舉此回應
長知識了,我怎麼沒想到copy呢?
感謝各位前輩不吝分享。
本篇文章回覆於2021-10-15 10:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.