2
來自C#4.0第7.5.5節。如何在構造後修改值類型的只讀字段
如果M是一個值類型中聲明的實例函數成員:
- [...]
- 如果E沒有歸類爲一個變量,則E的暫時局部變量類型被創建並且E的值被分配給 變量。 E然後被重新分類爲對該臨時局部變量的參考。臨時變量可以在 M之內訪問,但不能以其他任何方式訪問。因此,只有當E是真變量 (什麼是真變量??),呼叫者是否有可能觀察到M對此做出的更改。
埃裏克利珀接着說:
這一點說明了另一種方式,其中 可變性的複製值語義的結合,可能會導致麻煩。例如,對於 示例,在運行構建器之後,只讀字段未被分類爲變量。因此,試圖調用 值類型的只讀字段的內容的方法成功,但實際上 會變更副本!通過完全避免可變值類型 來避免這些問題。
如何重現Eric描述的scenerio?我嘗試了以下。它的錯誤了,我會想到:
struct A
{
public readonly int mutableReadonlyField;
public A(int originalValue)
{
mutableReadonlyField = originalValue;
}
public A MethodThatMutatesTheContentsOfAReadOnlyField(int mutate)
{
this.mutableReadonlyField = mutate;//Constructor has run so mutableReadonlyField is a temporary local variable
//ERROR: A readonly field cannot be assigned to (except in a constructor or a variable initializer)
A newA = this;//Is this a true variable?
return newA;
}
}
在我看來,一般而言,只讀和可變類型是一個錯誤的組合 – 2013-02-19 16:20:21
@ P.Brian.Mackey:正確這是一個更一般規則的特殊情況,即X和可變類型對X的所有值都是一個不好的組合。 – 2013-02-19 17:40:45