例:
Dim a As Integer = 1
Dim b As Integer = a
Console.WriteLine(b)
a = 0
Console.WriteLine(b)
出力:
1
0
何らかの理由で、実際には b を変更していなくても、a を変更すると b も変更されます。なぜこれが起こるのか、どうすれば回避できますか。
例:
Dim a As Integer = 1
Dim b As Integer = a
Console.WriteLine(b)
a = 0
Console.WriteLine(b)
出力:
1
0
何らかの理由で、実際には b を変更していなくても、a を変更すると b も変更されます。なぜこれが起こるのか、どうすれば回避できますか。
整数は値型なので、'a' を 'b' に代入するとCOPYが作成されます。どちらか一方をさらに変更すると、それ自体の変数内の特定のコピーにのみ影響します。
Module Module1
Sub Main()
Dim a As Integer = 1
Dim b As Integer = a
Console.WriteLine("Initial State:")
Console.WriteLine("a = " & a)
Console.WriteLine("b = " & b)
a = 0
Console.WriteLine("After changing 'a':")
Console.WriteLine("a = " & a)
Console.WriteLine("b = " & b)
Console.Write("Press Enter to Quit...")
Console.ReadLine()
End Sub
End Module
ただし、参照型について話している場合は、別の話です。
たとえば、整数がクラスにカプセル化され、クラスが参照型であるとします。
Module Module1
Public Class Data
Public I As Integer
End Class
Sub Main()
Dim a As New Data
a.I = 1
Dim b As Data = a
Console.WriteLine("Initial State:")
Console.WriteLine("a.I = " & a.I)
Console.WriteLine("b.I = " & b.I)
a.I = 0
Console.WriteLine("After changing 'a.I':")
Console.WriteLine("a.I = " & a.I)
Console.WriteLine("b.I = " & b.I)
Console.Write("Press Enter to Quit...")
Console.ReadLine()
End Sub
End Module
この 2 番目の例では、'a' を 'b' に代入すると、'b' が 'a' が指す Data() の同じインスタンスへのREFERENCEになります。したがって、'a' または 'b' からの 'I' 変数への変更は、どちらも Data() の同じインスタンスを指しているため、両方に表示されます。
参照: 「値型と参照型」