静态成员

本文关键字:静态成员 | 更新日期: 2023-09-27 18:13:09

为什么Class1。a仍然是空的,即使我引用它并改变它的值?字符串是引用类型,所以我认为改变它的值会影响引用,但事实并非如此。有人能告诉我为什么吗?是为了静态声明器吗?

class Class1
{
    public static string a;
}
void Main()
{
    string a = Class1.a;
    a = "hello";
    MessageBox.Show(Class1.a);
}

输出:

静态成员

您没有更改它的值。您只是将null引用复制到一个局部变量中,您将局部变量设置为引用一个新字符串,但在所有这些中,您从未将原始引用更改为引用null以外的任何内容。

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

例如:

Foo a = new Foo ();
Foo b = a;
b.Bar = 7;
b = new Foo ();
b.Baz = 12;

在这个例子中,a.b将是7,因为当时a和b引用了同一个对象。但是,a.Baz没有设置为12,因为b被更改为引用不同的对象。变量a仍然指向创建的第一个对象,而不是第二个对象。

String也不能让你修改对象(它是不可变的),但这是题外话——你的代码不能工作的原因是你修改了引用,而不是修改对象。

Main()中,当您写a = "hello";时,您告诉局部引用变量a引用不同的字符串。(之前在你写string a = Class1.a;时,它指的是与Class1.a相同的字符串)。

一般来说,a的新值将与Class1static成员所引用的值不同。

静态字段与类型相关联,而不是与对象相关联,这就是为什么它们即使与多个实例共享相同的存储,即无论您创建了多少对象,都很容易混淆。不管静态的,更重要的是引用是如何工作的

所以你的作业是。 string a = Class1.a;a仅具有Class1的参考价值。a是空的,但是在第二行a = "hello";上,您将其更改为参考点指向数据"hello"的其他东西,但这里是Class1。A仍然引用null

不是直接的,而是间接的,这个引用可能会帮助你:http://jonskeet.uk/csharp/parameters.html