为什么这个对象没有更新?

时间:2016-03-30 01:46:14

标签: c#

在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.objclass2.obj具有相同的价值怎么可能?

6 个答案:

答案 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.objclass2.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