繁体   English   中英

为什么不更新该对象?

[英]Why is this object not being updated?

在C#中,如果我在一个类中有一个对象变量,而第二个类具有设置为同一对象的对象变量,那么当第二个类更改了对象变量时,如何更新两个对象变量呢?

这是一些示例代码:

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.objclass1.obj保持不变。 这怎么可能class1.obj具有相同的价值class2.obj当任何值被设置为class2.obj

编辑:我添加了一篇博客文章 ,希望可以更清楚地说明和演示。 请不要冒犯,因为它说的是“绝对的初学者”。 我不知道您的背景/经验是什么,但是我喜欢从这个角度写。


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 它仍然指向同一对象。

您trowing从价值class2.obj时做掉

class2.obj = "test2";

另外,如果class1.obj是一个对象,并且可以在class1.objclass2.obj上更改其属性 ,则可以更改它。 没有重新分配另一个对象。

在这种情况下,您将间接使用字符串进行操作,而不是映射或分配类对象。 因此,在以下方面类似:

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";

在这里,您将创建该类的两个不同实例,并将一个实例分配给另一个实例。 这样一个对象的变化也会反映在另一个对象上。 但是对于字符串来说这是不可能的,因为它们是不可变的。

它不会更新另一个变量,因为您实际上是在修改指针而不是对象。

例如,运行此命令后

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的值未更改。 它仍然指向原始对象。

class2.obj = class1.obj;

在这里,您是将值从class1.obj分配给class2.obj,而不更改其引用。 因此,当class2.obj值更改时,class1.obj值将不会更改。

这将无法正常工作,请尝试使用类似以下内容的方法:

myclass a = new myclass();
a.integer = 1;

myclass b = new myclass();
b.integer = 2;

a = b;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM