考虑:
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; } } }
上面的代码提供了一个非常有说服力的编译错
readonly字段不能传递给ref或out(构造函数除外)