为什么只能通过ref参数修改只读字段?

时间:2015-12-31 23:04:20

标签: c# .net ref

考虑:

_value

这是如何编译的,但仍有效?我不应该为构造函数之外的readonly字段分配不同的值,因为它标有ref。但是,将run() is also { start unit1.thread(); start unit2.thread(); unit3.thread(); }; 传递给方法,确实可以对其进行操作。

这是危险的吗?为什么?我感觉不对,但我不能完全指责它。

1 个答案:

答案 0 :(得分:19)

它编译是因为您只在构造函数中将值作为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(构造函数除外)