在这个小提琴中,我们将静态字段分配给实例字段.当我们更改静态实例时,实例一仍然具有初始值.这是为什么?我们认为两者都应该指同一个对象,但似乎它们不是.
using System;
public class Program
{
public static string StaticString;
public string InstanceString;
public static void Main()
{
Program.StaticString = "foo";
var p = new Program();
p.InstanceString = Program.StaticString;
Program.StaticString = "bar";
Console.WriteLine(p.InstanceString);
}
}
Run Code Online (Sandbox Code Playgroud)
我们真的希望这可以打印,bar但它打印出来foo.
在这个小提琴中,我们将静态字段分配给实例字段.
对.这会将静态字段的当前值复制到实例字段.它不会永远将变量绑定在一起 - 它只是复制当前值.
当我们更改静态实例时,实例一仍然具有初始值.
是的,因为您刚刚更改了静态字段的值 - 为什么会更改实例字段的值?它们是独立的变量 - 它们碰巧在一个点上保持相同的值.重要的是,您没有对实例字段的值引用的字符串对象进行任何更改.(实际上你不能对字符串对象进行更改,因为字符串是不可变的.)
我将变量视为像纸一样,上面写着值.当变量是引用类型时,纸上的值只是导航到对象的一种方式 - 就像街道地址一样.但是将一个变量复制到另一个变量总是只是将写在一张纸上的内容复制到另一张纸上.例如,假设我有:
House x = new House();
House y = x;
x.DoorColor = Black;
x = null;
Console.WriteLine(y.DoorColor);
Run Code Online (Sandbox Code Playgroud)
这就像:
x,并在其上写一个街道地址x到一张纸上yx,把门漆成黑色xy并报告门的颜色最后一步会报告门是黑色的,对吧?擦掉写在纸上的价值x不会改变写在纸上的y东西,也不会改变房子的任何东西.
这与您的代码中的步骤并不完全相同,但希望它能更好地阐明它...