特になし

とりとめもなくダラダラ書いてみようという感じ・・・

全体表示

[ リスト ]

Visual Basic その 3

Visual Basic その 2 http://blogs.yahoo.co.jp/nobuyuki_tsukasa/1052503.html で、String 型だけ、他の参照型と挙動が違うというようなことを書いたが、またしても間違った解釈だったことがわかった。(汗)
例えば、
Public Class Class1
    Public Name As String
End Class
というクラスを使って、
Imports System
Module Module1
 
    Sub Main() 
        Dim c1 As Class1 = New Class1()
        c1.Name = "c1" 
        ByValClass1(c1)
        Debug.WriteLine(c1.Name)
        ByRefClass1(c1)
        Debug.WriteLine(c1.Name)
    End Sub
 
    Private Sub ByValClass1(ByVal c As Class1)
        c.Name = "ByValClass1"
    End Sub
 
    Private Sub ByRefClass1(ByRef c As Class1)
        c.Name = "ByRefClass1"
    End Sub
 
End Module
を実行すると
ByValClass1
ByRefClass1
と出力される。これは、ByVal だろうと ByRef だろうと関数に渡される値 ( c1 のアドレス ) は同じだからなのだが、String 型の場合もこれと同じで
Imports System
Module Module1
 
    Sub Main()
        Dim s1 As String = "Test"
        ByValString(s1)
        Debug.WriteLine(s1)
        ByRefString(s1)
        Debug.WriteLine(s1)
    End Sub

    Private Sub ByValString(ByVal s As String)
        s = "ByValSub"
    End Sub
 
    Private Sub ByRefString(ByRef str As String)
        s = "ByRefSub"
    End Sub
 
End Module
の実行結果が
ByValSub
ByRefSub
となるのが正しくて、
Test
ByRefSub
となるのがおかしいと思っていたのである。
どこが勘違いポイントだったかというと、
Private Sub ByValString(ByVal s As String)
    s = "ByValSub"
End Sub
の動作を、参照先の内容を変更するものだと思ってしまっていたところだ。
実際には、これは s の参照先を付け替えてしまうので、付け替える前の参照先(つまり、Main() 内の s1 ) の内容は何も変わらないのである。
 
ここまでは、非常にスッキリした話であるが・・・。

.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事