none
關於傳址呼叫的用法請益 RRS feed

  • 問題

  • 各位大大好

    我想要確認一個部份是底下
        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 程式設計手冊 實值型別和參考型別]
    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    • 已標示為解答 Max197 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 程式設計手冊 實值型別和參考型別]
    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    • 已標示為解答 Max197 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