# 關於傳址呼叫的用法請益

• ### 問題

• 各位大大好

我想要確認一個部份是底下
Public Sub A(ByVal P As Integer, ByVal W As String, ByRef K() As String)
D = P
K(D) = W
KK = K
End Sub

KK 這個部份是僅只有 對應K 的指標 還是  把K 的資料都複製進來的呢
如果是僅傳址  所以 宣告 Dim KK() As String 也是對得嗎??  DIm 可以宣告傳址與傳值??

麻煩各位了

ㄒㄒ那另外想跟您請教的是  我這樣的寫法  有無更恰當 更標準的作法呢

-----------------------------------------------------------------------------------
Public Class Class1
Public DD(100) As String

Public Function P(ByVal xShow As Integer) As String
Return DD(xShow)
End Function
End Class
-----------------------------------------------------------------------------------
Public Class Class2
Dim D As Integer
Dim KK() As String
Public Sub A(ByVal P As Integer, ByVal W As String, ByRef K() As String)
D = P
K(D) = W
KK = K
End Sub
Public Sub RndB()

Application.DoEvents()
KK(D) = CStr(Int((6000 * Rnd()) + 1))

End Sub
End Class
-----------------------------------------------------------------------------------

Public Class Form1

Dim M As New Class1

Dim Q() As Class2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'Public Sub A(ByVal P As Integer, ByVal W As String, ByRef K() As String)

Q(0).A(0, "0000", M.DD)
Q(1).A(1, "1111", M.DD)

TextBox1.Text = M.P(0)
TextBox2.Text = M.P(1)

Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ReDim Q(1)
Q(0) = New Class2
Q(1) = New Class2
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Q(0).RndB()
Q(1).RndB()
TextBox1.Text = M.P(0) & "===" & M.P(1)
TextBox2.Text = M.P(1) & "===" & M.P(0)
End Sub
End Class

2009年6月29日 上午 03:35

### 解答

• 陣列不論你用Byval 還是 Byref 基本上都是傳遞參考指標的 , 在VB.NET中只要非實值型別都是傳遞參考指標
以下有個簡單的程式你可以從結果看出來
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim kk(2) As String
kk(0) = "A"
kk(1) = "B"
kk(2) = "C"
test1(kk)
TextBox1.Text = kk(0) & kk(1) & kk(2)
Test2(kk)
TextBox2.Text = kk(0) & kk(1) & kk(2)
End Sub
Private Sub test1(ByRef kk() As String)
kk(2) = "L"
End Sub
Private Sub Test2(ByVal KK() As String)
KK(1) = "P"
End Sub
最終結果
TextBox1是ABL 而TextBox2則是APL
可以參考 [Visual Basic 程式設計手冊 實值型別和參考型別]
請關心自己的問題，不要問了就放空；這是對別人與自己的尊重
• 已標示為解答 2009年6月29日 上午 04:44
2009年6月29日 上午 03:52

### 所有回覆

• 陣列不論你用Byval 還是 Byref 基本上都是傳遞參考指標的 , 在VB.NET中只要非實值型別都是傳遞參考指標
以下有個簡單的程式你可以從結果看出來
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim kk(2) As String
kk(0) = "A"
kk(1) = "B"
kk(2) = "C"
test1(kk)
TextBox1.Text = kk(0) & kk(1) & kk(2)
Test2(kk)
TextBox2.Text = kk(0) & kk(1) & kk(2)
End Sub
Private Sub test1(ByRef kk() As String)
kk(2) = "L"
End Sub
Private Sub Test2(ByVal KK() As String)
KK(1) = "P"
End Sub
最終結果
TextBox1是ABL 而TextBox2則是APL
可以參考 [Visual Basic 程式設計手冊 實值型別和參考型別]
請關心自己的問題，不要問了就放空；這是對別人與自己的尊重
• 已標示為解答 2009年6月29日 上午 04:44
2009年6月29日 上午 03:52
• 我看了你底下的程式，補充幾個觀念上的問題(只保留你宣告的部份)：
-----------------------------------------------------------------------------------
Public Class Class1
Public DD(100) As String
End Class
這樣的宣告表示DD在Class1是全域的，而且可以由外部存取，意思是說當你在另一個程式碼中宣告一個Class1的執行個體，假設叫myClass1，可以直接在該程式碼存取 myCalss1.DD
-----------------------------------------------------------------------------------
Public Class Class2
Dim D As Integer
Dim KK() As String
End Class
這樣的宣告表是 D與KK在Class2是全域的，使用Dim 會隱含Private，所以外部程式碼無法直接存取這兩個變數。和Class1的DD不同。
請關心自己的問題，不要問了就放空；這是對別人與自己的尊重
2009年6月29日 上午 04:26
• 嗯嗯  謝謝您的 答覆

所以 以我的想法與目標是  透過 Thread And New 的方式創造很多Class2  然後同步更新  單一個  Class 1 的陣列資料

我想如果透過上面的方法應該就可以 這樣做到了  應該是這樣吧 !!  ^^
2009年6月29日 上午 04:43