【发布时间】:2016-04-05 18:31:12
【问题描述】:
考虑:
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传递给方法,确实可以操作。
这很危险吗?为什么?对我来说感觉不对,但我不能完全理解它。
【问题讨论】:
-
因为已经存在一个永远无法写入的只读值,所以它是
default。一个有用的readonly变量必须至少写一次。不太明显的细节是字段初始化实际上发生在构造函数中,C# 编译器移动了代码。