C# 为什么可以通过ref参数修改只读字段?
考虑:C# 为什么可以通过ref参数修改只读字段?,c#,.net,ref,C#,.net,Ref,考虑: class Foo { private readonly string _value; public Foo() { Bar(ref _value); } private void Bar(ref string value) { value = "hello world"; } public string Value { get { return _value;
class Foo
{
private readonly string _value;
public Foo()
{
Bar(ref _value);
}
private void Bar(ref string value)
{
value = "hello world";
}
public string Value
{
get { return _value; }
}
}
// ...
var foo = new Foo();
Console.WriteLine(foo.Value); // "hello world"
尽管如此,这是如何编译的?我不能将不同的值分配给构造函数外部的\u value
字段,因为它标记为只读
。但是,通过ref
将其传递给一个方法,它确实可以被操纵
这危险吗?为什么?我觉得它不对,但我不能完全指出它。它是编译的,因为您只将值作为构造函数中的
ref
参数传递(其中允许设置readonly
字段)。如果将对Bar()
的调用移动到其他方法中,则会失败
class Foo
{
private readonly string _value;
public Foo()
{
Bar(ref _value);
}
public void Baz()
{
Bar(ref _value);
}
private void Bar(ref string value)
{
value = "hello world";
}
public string Value
{
get { return _value; }
}
}
上面的代码提供了一个非常明显的编译器错误:
只读字段不能传递ref或out(构造函数中除外)
差不多。不危险,因为_值在构造后不能修改,也不会暴露在外部(除了get访问器),谢谢。不知怎的,那东西从我身边溜走了。:)因为已经存在一个永远无法写入的只读值,所以它是
default
。有用的只读变量必须至少写入一次。不太明显的细节是字段初始化实际上发生在构造函数中,C#编译器移动代码。