参考和值类型方案

fle*_*her 4 .net c# value-type reference-type

我一直在努力彻底了解参考和价值类型.就在我以为自己拥有它的时候,我遇到了这个场景......

我创建了一个包含单个对象的类.

class Container
{
    public object A {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

当我创建此Container类的实例(a)时,我正在创建引用类型的实例.我为类中的对象分配了一个整数.据我所知,这将被装箱作为对象,另一种参考类型.

int start = 1;  
Container a = new Container{ A=start };
Run Code Online (Sandbox Code Playgroud)

我创建了Container类的另一个实例(b),但是为它分配了第一个容器的值,b的值现在是对a的引用.

Container b = a;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当我打印出aA和bA的值时,它们是相同的.

Console.WriteLine("a.A={0},b.A={1}",a.A,b.A);
//a.A=1,b.A=1
Run Code Online (Sandbox Code Playgroud)

并且,正如预期的那样,当我更改aA的值时,bA的值也会因为它们引用相同的对象而发生变化.

a.A = 2;

Console.WriteLine("a.A={0},b.A={1}",a.A,b.A);
// a.A=2,b.A=2
Run Code Online (Sandbox Code Playgroud)

现在我决定尝试使用单个本地对象.再次,我将整数打包到第一个对象中,并将第一个对象的值分配给第二个对象.我认为此时的对象应该是引用类型,因此c和d应该引用相同的对象.不改变任何东西,它们返回相同的值.

int start = 1;
object c = start;
object d = c;

Console.WriteLine("c={0},d={1}",c,d);
// c=1,d=1
Run Code Online (Sandbox Code Playgroud)

像以前一样,在更改初始对象的值时,我希望两个对象的值相同.

c = 2;

Console.WriteLine("c={0},d={1}",c,d);
// c=2,d=1
Run Code Online (Sandbox Code Playgroud)

当我打印这两个对象的结果时,d的值不像以前那样改变.

有人可以解释为什么这个场景中的作业与之前的作业有所不同吗?

谢谢

Jon*_*eet 10

这是你的第一个错误:

创建容器类(B)的另一个实例,但将第一个容器到它的值,b的值现在是一个参考.

Container b = a;
Run Code Online (Sandbox Code Playgroud)

不是创建另一个实例.它正在声明另一个变量.现在两个变量都引用同一个对象.

(我会继续编辑这个答案,因为我一直在阅读......)

接下来:

int start = 1;
object c = start;
object d = c;
Console.WriteLine("c={0},d={1}",c,d); // c=1,d=1
Run Code Online (Sandbox Code Playgroud)

像以前一样,在更改初始对象的值时,我希望两个对象的值相同.

c = 2;
Console.WriteLine("c={0},d={1}",c,d); // c=2,d=1
Run Code Online (Sandbox Code Playgroud)

这并没有改变它正在改变变量对象.每个赋值都复制一个值 - 除了其中一个也执行装箱操作.让我们稍微简化一下:

object c = "first string";
object d = c;
Run Code Online (Sandbox Code Playgroud)

现在没有涉及拳击 - 它只是让它更容易理解.

两个变量当前都具有引用同一对象的值.这是由于赋值,但没有其他任何东西将这两个变量联系起来.它们恰好具有相同的价值,但它们是独立的变量.现在让我们改变一个:

c = "different string";
Run Code Online (Sandbox Code Playgroud)

已经改变的的值c来指代不同的对象.如果打印出来的价值观cd他们将分别为"不同的字符串"和"第一个".更改值c不会更改值d.


现在,让我们回到你之前的场景,看看为什么会有所不同.在那里,你有:

a.A = 2;
Run Code Online (Sandbox Code Playgroud)

这根本不会改变价值a.它正在改变对象a所指的数据.

让我们用一个真实世界的比喻来使这更容易.假设我们所有的变量都是纸上写有房屋地址的.改变a.A = 2;就像改变该地址的房子内容.当然,在他们的纸上写有相同地址的任何人都会看到这一变化.

现在想想你的c/ d场景.再次,假设我们有两张纸,由于赋值运算符,它们都有相同的地址写在它们上面.现在,为c变量本身分配一个新值就像擦掉c纸上的地址并在其上写一个不同的地址.这根本不会改变那d张纸 - 它仍然有旧的地址,如果你去那个房子,你会看到没有任何改变.它只是写在纸上的内容已经改变了.

这有帮助吗?