解释静态成员

CRK*_*CRK 1 c# string class

为什么Class1.a仍然为null,即使我引用它并更改其值?字符串是引用类型,所以我认为更改值会影响引用,但事实并非如此.有人能解释我为什么吗?这是静态声明者?

class Class1
{
    public static string a;
}
void Main()
{
    string a = Class1.a;
    a = "hello";
    MessageBox.Show(Class1.a);
}
Run Code Online (Sandbox Code Playgroud)

输出:null

PMV*_*PMV 6

你没有改变它的价值.您刚刚将空引用的副本复制到局部变量中,您将局部变量设置为引用新字符串,但在所有这些中,您从未更改原始引用以引用除null之外的任何内容.

确实,字符串是引用类型,但即使使用引用类型,更改引用本身也不同于更改引用对象的属性.

例如:

Foo a = new Foo ();
Foo b = a;
b.Bar = 7;
b = new Foo ();
b.Baz = 12;
Run Code Online (Sandbox Code Playgroud)

在此示例中,a.Bar将为7,因为在a和b时引用相同的对象.但是,a.Baz未设置为12,因为b被更改为引用不同的对象.变量a仍然指的是创建的第一个对象,而不是第二个.

字符串另外不允许您修改对象(它是不可变的),但这是一个旁边 - 您的代码不起作用的原因是您正在修改引用,而不是修改对象.