gpt4 book ai didi

c# - 跨几个变量的引用类型分配

转载 作者:行者123 更新时间:2023-12-05 09:26:24 24 4
gpt4 key购买 nike

我要问的问题让我感到困惑,只是因为我正在深入研究一些 C# 细节。考虑以下代码:

    public class Node 
{
public int Data {get;set;}
}

var a = new Node() { Data = 1 }; // address in memory 0x600000
var b = new Node() { Data = 2 }; // address in memory 0x700000
var c = new Node() { Data = 3 }; // address in memory 0x800000

a = b; // variable a holds a reference to the memory location of b -> 0x700000
b = c; // variable b holds a reference to the memory location of c -> 0x800000

如果我这样做

b.Data = 4;

这是我的输出

Console.WriteLine(a.Data);  //2
Console.WriteLine(b.Data); //4
Console.WriteLine(c.Data); //4

在这里,我期望所有三个变量都打印出 4。为什么?因为,从代码的角度来看,a 引用了 bb 引用了 c,因此 ac 都引用了完全相同的内存位置 - 这是错误的。

最后的话或者我是如何对自己解释的:
a 的值是对象 b 的地址,b 的值是对象 c

的地址

bc 位于内存中的两个不同位置,因此当您对 b 应用更改时,将在您通过变量 bc 访问它,就像您正在更改变量 c 的值一样有效(bc 指的是存储数据的同一内存地址空间)。当您通过 a 访问一个值时,即使在您引用了 b 的代码中,这些值也不可见。实际上,这里的 a 根本没有改变,因此我们得到了变量 b 指向的值。

我的理解是否正确,或者您有更清晰的解释吗?

最佳答案

当你这样做时:

a = b; 

a 现在指向 b 也指向的内存位置,但是当以下行执行时:

b = c;

现在 bc 都指向相同的内存位置,所以当我们更新 b 时,它被更改为相同的内存bc 都指向的位置,但是 a 没有指向该内存位置,因此它不会将更改视为引用按值传递。

如果我们希望所有引用变量都反射(reflect)更改,那么我们应该使用引用传递。 You can read more about the difference between pass by value and pass by reference to get more understanding .

请参阅以下内容以帮助理解当 b 被分配给 c 时,它与它的原始内存位置断开连接,现在 bc 都引用公共(public)内存位置但不是 a:

enter image description here

如果您将它们分配在单行上,则可以实现您期望的行为:

a = b = c;

现在,当您使用 c 变量更新 Data 时,它将反射(reflect)所有 3 个变量。

请查看下图以了解在这种情况下发生了什么:

enter image description here

关于c# - 跨几个变量的引用类型分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73988941/

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