在C#中,如果我在一个类中有一个对象变量,而另一个类有一个设置为同一个对象的对象变量,那么当第二个类的对象变量发生变化时,如何更新这两个对象变量? / p>
以下是一些代码示例:
public class Class1
{
public object obj { get; set; }
}
public class Class2
{
public object obj { get; set; }
}
private void SetObject()
{
var class1 = new Class1();
class1.obj = "test";
var class2 = new Class2();
class2.obj = class1.obj;
class2.obj = "test2";
}
在上面的代码中,更改class2.obj
时,class1.obj
保持不变。当任何值设置为class1.obj
时,class2.obj
与class2.obj
具有相同的价值怎么可能?
答案 0 :(得分:3)
编辑:我添加了一个blog post,希望能够更清楚地解释和演示。请不要被冒犯,因为它说'绝对是初学者'。"我不知道你的背景/经历是什么,但我喜欢从那个角度写作。
class2.obj
不是一个值。它是对象的引用。在致电class2.obj = "test2"
之前,class2.obj
包含对字符串的引用" test"。
然后你将它改为引用另一个对象 - 字符串" test2"。
class1.obj
仍然指向它所做的同一个对象,这是一个不同的对象,字符串" test。"
如果他们都指向同一个对象并且您更改了该对象的属性,那么您将看到两个地方都反映出的变化,因为那时会有两个变量引用同一个对象。
一旦你得到它就会点击,但我认为需要一个例子来做到这一点。
假设我们有这个课程:
public class ThingWithValue
{
public string Value { get; set; }
}
我们创建了一些实例:
var thing1 = new ThingWithValue { Value = "A" };
var thing2 = new ThingWithValue { Value = "B" };
这将创建一个指向与thing1
相同的对象的新变量。有两个变量,但只有一个对象:
var thing3 = thing1;
因此,如果我在thing3
上设置了一个属性,那么我也会在thing1
上设置它,因为它们都是同一个对象。
thing3.Value = "C";
但如果我这样做:
thing1 = null;
然后我唯一改变的是变量 - 它不再指向该对象。我没有改变那个对象。它仍然存在。 thing3
不会成为null
。它仍然指向同一个对象。
答案 1 :(得分:0)
在执行
时,你正在从class2.obj
开始榨取价值
class2.obj = "test2";
此外,如果class1.obj
是对象,并且您在class1.obj
或class2.obj
上更改了属性,则可以更改它。没有重新分配另一个对象。
答案 2 :(得分:0)
在您的情况下,您使用字符串间接执行操作,未映射或分配类对象。因此它类似于以下内容:
string s1 = "abc";
string s2 = s1;
s2 = "123";
// this wont change the value of s1;
通过将字符串文字分配给String变量,您实际上是实例化一个新的字符串对象并分配给现有的字符串:
您实际期望的是:
var class1Object1 = new Class1();
class1Object1.obj = "test";
var class1Object2 = new Class1();
class1Object2 = class1Object1;
class1Object2.obj = "test2";
在这里,您将创建该类的两个不同实例,并将它们分配给另一个。这样一个对象的变化也会反映在另一个对象中。但是在字符串的情况下这是不可能的,因为它们是不可变的。
答案 3 :(得分:0)
它不会更新其他变量,因为您实际上是在修改指针,而不是对象。
例如,在运行此
之后class1.obj = "test";
我们可以想象内存布局如下:
Mem Address Name Value
0x0001 Class1.obj 0x0003
0x0002 Class2.obj
0x0003 string "test"
然后我们运行:
class2.obj = class1.obj;
现在内存看起来像是:
Mem Address Name Value
0x0001 Class1.obj 0x0003
0x0002 Class2.obj 0x0003
0x0003 string "test"
最后:
class2.obj = "test2";
给我们这个:
Mem Address Name Value
0x0001 Class1.obj 0x0003
0x0002 Class2.obj 0x0004
0x0003 string "test"
0x0004 string "test2"
请注意,Class1.obj
的值尚未更改。它仍然指向原始对象。
答案 4 :(得分:0)
class2.obj = class1.obj;
在这里,您将class1.obj中的值赋给class2.obj,而不是更改其引用。因此,当class2.obj值更改时,class1.obj值不会更改。
答案 5 :(得分:0)
这不起作用,请尝试使用以下内容:
TABLE_NAME