将静态字段分配给实例字段并不指向同一对象的内容

Sha*_*tin 1 c#

在这个小提琴中,我们将静态字段分配给实例字段.当我们更改静态实例时,实例一仍然具有初始值.这是为什么?我们认为两者都应该指同一个对象,但似乎它们不是.

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.

Jon*_*eet 6

在这个小提琴中,我们将静态字段分配给实例字段.

对.这会将静态字段的当前值复制到实例字段.它不会永远将变量绑定在一起 - 它只是复制当前值.

当我们更改静态实例时,实例一仍然具有初始值.

是的,因为您刚刚更改了静态字段的值 - 为什么更改实例字段的值?它们是独立的变量 - 它们碰巧在一个点上保持相同的值.重要的是,您没有对实例字段的值引用的字符串对象进行任何更改.(实际上你不能对字符串对象进行更改,因为字符串是不可变的.)

我将变量视为像纸一样,上面写着值.当变量是引用类型时,纸上的值只是导航到对象的一种方式 - 就像街道地址一样.但是将一个变量复制到另一个变量总是只是将写在一张纸上的内容复制到另一张纸上.例如,假设我有:

House x = new House();
House y = x;
x.DoorColor = Black;
x = null;
Console.WriteLine(y.DoorColor);
Run Code Online (Sandbox Code Playgroud)

这就像:

  • 创建一张纸x,并在其上写一个街道地址
  • 把写在纸上的东西复制x到一张纸上y
  • 去房子,地址写在纸上x,把门漆成黑色
  • 擦掉写在纸上的地址 x
  • 去房子,地址写在纸上,y并报告门的颜色

最后一步会报告门是黑色的,对吧?擦掉写在纸上的价值x不会改变写在纸上的y东西,也不会改变房子的任何东西.

这与您的代码中的步骤并不完全相同,但希望它能更好地阐明它...

  • @ShaunLuttin:是的,我们是.我们将值(即参考值)从静态字段复制到实例字段.但这就是全部 - 它只是复制那个价值.然后,您将为静态字段提供不同的值 - 这不会更改实例字段中的值.有关更长的示例,请参阅我的编辑. (2认同)
  • @ShaunLuttin:没错.您可能想尝试更改代码以使用`StringBuilder`,而不是使用`Program.StaticString ="bar"`,使用`Program.StaticString.Append("bar")`... (2认同)