为什么可以通过ref参数修改readonly字段?
Why can readonly fields be modified through ref parameters?
考虑:
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"
这如何编译,仍然有效?我不应该能够在构造函数之外为 _value
字段分配不同的值,因为它被标记为 readonly
。但是,通过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; }
}
}
以上代码提供了一个非常明显的编译器错误:
A readonly field cannot be passed ref or out (except in a constructor)
考虑:
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"
这如何编译,仍然有效?我不应该能够在构造函数之外为 _value
字段分配不同的值,因为它被标记为 readonly
。但是,通过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; }
}
}
以上代码提供了一个非常明显的编译器错误:
A readonly field cannot be passed ref or out (except in a constructor)