2013-02-19 78 views
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; 
     } 
} 

回答

4

我給我的博客上這樣的例子:

http://ericlippert.com/2008/05/14/mutating-readonly-structs/

的問題是,我的句子片段「值類型的只讀字段」是含糊不清和誤導性的。我希望它意味着類別中的只讀字段,其中字段爲值類型S,但顯然更自然的讀數是將其作爲S本身的只讀字段。我應該完全重寫這個句子。抱歉的錯誤。

要回答你的其他問題:形容詞「真」是不必要的。如果它只是說「因此,只有當E是變量時,句子纔會同樣正確,因此調用者可能會觀察到M對此做出的更改。」

+0

在我看來,一般而言,只讀和可變類型是一個錯誤的組合 – 2013-02-19 16:20:21

+1

@ P.Brian.Mackey:正確這是一個更一般規則的特殊情況,即X和可變類型對X的所有值都是一個不好的組合。 – 2013-02-19 17:40:45

相關問題