为什么Class1.a仍然为null,即使我引用它并更改其值?字符串是引用类型,所以我认为更改值会影响引用,但事实并非如此。有人能解释我为什么吗?这是静态声明者吗?
class Class1
{
public static string a;
}
void Main()
{
string a = Class1.a;
a = "hello";
MessageBox.Show(Class1.a);
}
输出:null
答案 0 :(得分:6)
你没有改变它的价值。您刚刚将空引用的副本复制到局部变量中,您将局部变量设置为引用一个新字符串,但在所有这些中,您从未更改原始引用以引用除null之外的任何内容。
字符串是引用类型,但即使使用引用类型,更改引用本身也不同于更改引用对象的属性。
例如:
Foo a = new Foo ();
Foo b = a;
b.Bar = 7;
b = new Foo ();
b.Baz = 12;
在这个例子中,a.Bar将是7,因为在a和b时引用了同一个对象。但是,a.Baz未设置为12,因为b被更改为引用不同的对象。变量a仍然指的是创建的第一个对象,而不是第二个。
字符串另外不允许您修改对象(它是不可变的),但这是一个旁边 - 您的代码无法工作的原因是您正在修改引用,而不是修改对象。
答案 1 :(得分:0)
在Main()
中,当您编写a = "hello";
时,您告诉本地引用变量a
引用不同的字符串。 (之前在您的撰写string a = Class1.a;
中,它指的是与Class1.a
相同的字符串。)
a
的新值通常与static
Class1
javascript
成员的字符串不同。
答案 2 :(得分:-1)
静态字段与类型而不是对象相关联这就是为什么即使使用多个实例它们共享相同存储的原因,即无论您创建多少个对象并且容易与之混淆。无论静态更多,参考如何工作
所以你的任务即
string a = Class1.a;
a只有Class1.a中的引用值为null,但是在第二行a = "hello";
上,您将其更改为引用指向数据"hello"
的其他内容,但此处为Class1.a仍然引用null。
不直接但间接地此引用可能对您有所帮助:http://jonskeet.uk/csharp/parameters.html