gpt4 book ai didi

c# - 就像字符串是对象类型是不可变的吗?

转载 作者:行者123 更新时间:2023-11-30 19:35:57 25 4
gpt4 key购买 nike

我试图理解值类型和引用类型之间的区别,并且怀疑我无法理解 Person 类(用户定义的数据类型)和对象类型之间的区别。

当我执行 Person p1 = new Person();p1.Name = "Ashu"; "Ashu"将被存储在堆中,并且在 p2 = p1; 之后, p2 将查看此内存,并且使用 p2 进行的任何更改也会更改 p1,因为两者都指向同一内存。

          // Just a demo which shows data changed for ref type
Person p1 = new Person();
Person p2 = new Person();
p1.Id = 10;
p2 = p1;
p2.Id = 20;
Console.WriteLine(p1.Id); // Output 20

为什么上面的原则对于下面的例子不成立,因为对象也是引用类型

        // Same example when type is "Object"
object obj1 = new object();
object obj2 = new object();
obj1 = 10;
obj2 = obj1;
obj2 = 20;
Console.WriteLine(obj1); // Output 10

最佳答案

对;让我们开始吧!

 Person p1 = new Person();

我们现在有一个变量和一个 Person 对象(默认情况下 Id = 0)

p1 ---------------> [Person #0, Id = 0]

Person p2 = new Person();

我们现在有 2 个变量和 2 个对象(默认情况下 Id = 0)

p1 ---------------> [Person #0, Id = 0]
p2 ---------------> [Person #1, Id = 0]

p1.Id = 10;

通过p1 取消引用 对象并在末尾设置 Id:

p1 ---------------> [Person #0, Id = 10]
p2 ---------------> [Person #1, Id = 0]

p2 = p1;

p1 的值覆盖p2 的引用。在此操作中没有创建或销毁任何对象,但现在它们都指向同一个对象:

p1 ---------------> [Person #0, Id = 10]
p2 -------------------/|\

(注意另一个对象仍然存在于某处,但我们无法再访问它;GC 会找到它并很快将其杀死)


    p2.Id = 20;

通过 p2 中的引用取消引用一个对象。我们只有 一个可达的对象,所以我们不应该对我们发现自己的位置感到惊讶:

p1 ---------------> [Person #0, Id = 20]
p2 -------------------/|\

    Console.WriteLine(p1.Id);  // Output 20

这通过 p1 指向同一个对象取消引用对象,所以我们输出 20:

p1 ---------------> [Person #0, Id = 20]
p2 -------------------/|\

    object obj1 = new object();

这将创建一个新的 System.Object 实例并将对它的引用分配给 obj1:

obj1 ---------------> [Object #0]

object obj2 = new object();

这做同样的事情 - 另一个新的 Object 和新的变量:

obj1 ---------------> [Object #0]
obj2 ---------------> [Object #1]

    obj1 = 10;

这将创建另一个新对象 - 这次是一个装箱整数:

obj1 ---------------> [Int32 #0, value 10]
obj2 ---------------> [Object #1]

    obj2 = obj1;

复制此引用:

obj1 ---------------> [Int32 #0, value 10]
obj2 --------------------/|\

    obj2 = 20;

创建另一个对象并分配给obj2:

obj1 ---------------> [Int32 #0, value 10]
obj2 ---------------> [Int32 #1, value 20]

最后

    Console.WriteLine(obj1); // Output 10

引用 obj1 并找到值 10:

obj1 ---------------> [Int32 #0, value 10]
obj2 ---------------> [Int32 #1, value 20]

不同之处在于,在第一个版本中,我们在最后与同一个对象进行对话;在第二个版本中,我们正在与 2 个不同的对象交谈(碰巧是不可变的,但这不是重点;如果我们有一个可变对象,我们仍然会看到这种行为;不同之处在于:分配引用 vs 改变属性 < em>通过引用)。

关于c# - 就像字符串是对象类型是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49538289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com