は考えてみましょう:refフィールドを使って読み取り専用フィールドを変更できるのはなぜですか?
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"
はどのようにこれはコンパイルすらない、それにもかかわらず動作しますか? readonly
とマークされているので、コンストラクターの外側の_value
フィールドに異なる値を割り当てることができません。しかし、それをref
でメソッドに渡してください。実際には操作できます。
危険ですか?どうして?それは私に間違っていると感じますが、私はそれに私の指を置くことはできません。
:
上記のコードは非常に占いコンパイラエラーを提供します。有用な 'readonly'変数*は、少なくとも1回書く必要があります。それほど明白な詳細は、フィールドの初期化が実際にコンストラクタで行われ、C#コンパイラがコードを移動するということです。 –