[英]Why the database data is not being updated but object did and without error?
[英]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.obj
, class1.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.obj
或class2.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.