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#編譯器移動代碼。 –