这些年来我注意到了一些东西,并且从未对它进行太多考虑,因为我通常不会遇到它。但是,我很想知道是否有人可以解释为什么某些对象会将自己设置为指向另一个对象而不是使用对象的值。这可能并不完全正确,但这是我尝试解释它的最佳方式。如果有人提出类似的问题我很抱歉,我找不到它们。
以下面的例子为例:
If True Then
Dim t1 As TextBox = New TextBox()
t1.Text = "test"
Dim t2 As TextBox = t1
Console.WriteLine(t1.Text) 'Outputs "test"
Console.WriteLine(t2.Text) 'Outputs "test"
t1.Text = "test2"
Console.WriteLine(t1.Text) 'Outputs "test2"
Console.WriteLine(t2.Text) 'Outputs "test2"
t2.Text = "test3"
Console.WriteLine(t1.Text) 'Outputs "test3"
Console.WriteLine(t2.Text) 'Outputs "test3"
End If
If True Then
Dim t1 As TextBox = New TextBox()
t1.Text = "test"
Dim t2 As TextBox = New TextBox()
t2.Text = t1.Text
Console.WriteLine(t1.Text) 'Outputs "test"
Console.WriteLine(t2.Text) 'Outputs "test"
t1.Text = "test2"
Console.WriteLine(t1.Text) 'Outputs "test2"
Console.WriteLine(t2.Text) 'Outputs "test"
t2.Text = "test3"
Console.WriteLine(t1.Text) 'Outputs "test2"
Console.WriteLine(t2.Text) 'Outputs "test3"
End If
尽可能地,当我将对象设置为等于另一个时,它不会创建新对象而是创建指针。对任一对象的任何修改都将影响这两个对象。如果我只选择一个属性,例如Text属性并将它们设置为彼此相等,它们都会独立行动。此外,如果我重复相同的逻辑并使用字符串或整数,并将一个字符串设置为等于另一个字符串,则两个字符串独立地起作用,并且不受对另一个字符串的修改的影响。
所以我的问题是,为什么当我将两个(本例中的文本框)设置为彼此相等时,在内存中创建的新相同对象不是,但是其他对象如字符串或整数?它如何决定某些对象将成为指针而其他对象将使用这些值?此外,是否有一种简单的方法来创建对象的新副本,而无需手动设置每个属性等于另一个属性?
答案 0 :(得分:4)
您所谈论的只是值类型(基本上是结构)和引用类型(基本上是类)之间的区别。值类型变量包含对象,而引用类型变量包含对对象的引用。将一个变量分配给另一个变量时,复制变量的内容。对于值类型变量,您正在复制值,即对象,而对于引用类型变量,您将引用复制到对象,因此仍然只有一个对象。
String是一个类,即引用类型,它的行为与所有其他引用类型完全相同。有时可能看起来没有,因为对String的任何操作实际上都会创建一个新的String对象,而不是修改现有的实例。要证明它的行为与其他引用类型相同,请尝试以下方法:
Dim s1 As String = "Hello World"
Dim s2 As String = s1
If s1 Is s2 Then
Console.WriteLine("s1 and s2 refer to the same object.")
Else
Console.WriteLine("s1 and s2 do not refer to the same object.")
End If