2012-10-29 137 views
1

我的代碼需要設置我的類的字段,但我希望該字段只能設置一次。如果開發人員試圖重置/更改它,我會理想地喜歡編譯器告訴我們,而不是獲取運行時錯誤。這可能嗎?創建一個編譯錯誤,而不是運行時錯誤

代碼,以幫助解釋

internal class Message 
    { 
     private string title = string.Empty; 

     public string Title 
     { 
      get { return title; } 
      set 
      { 
       if (string.IsNullOrEmpty(title)) 
        title = value; 
       else 
        throw new Exception("Title can only be set once!"); 
      } 
     } 
    } 

正如你所看到的,上面會拋出異常,但是這是一個運行時錯誤。雖然這裏的示例相當簡單,但編寫編譯器錯誤或警告消息的概念可能非常有用。

+4

['readonly'](http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx)是以何種方式不足? – Jon

+0

程序不編譯;如果我創建了「私人只讀字符串標題」或「公共只讀字符串標題」,我收到錯誤消息「修飾符'只讀'不適用於此項目' – Dave

+0

然後顯然有一些錯誤。 't work。 – Jon

回答

4

你所要求的是一個自定義編譯器規則,AFAIK是不可能的。國際海事組織你有2個選項,一個是使它成爲構造函數的一部分,所以它只能被設置一次,例如。

internal class Message 
{ 
    public Message(string title) 
    { 
     Title = title; 
    } 

    public string Title { get; private set; } 
} 

另一個是保持它的方式,但是,拋出一個更合適的例外,例如,

internal class Message 
{ 
    private string title = string.Empty; 

    public string Title 
    { 
     get { return title; } 
     set 
     { 
      if (string.IsNullOrEmpty(title)) 
       title = value; 
      else 
       throw new InvalidOperationException("Title can be set only once!"); 
     } 
    } 
} 

無論哪種方式,Title屬性僅以往任何時候都得到設置一次。

+0

但是,這些會通過編譯警告消息提醒開發人員嗎? – Dave

+0

@Dave第一個會 - 現在不可寫入,並且必須通過構造函數設置 –

+0

@MarcGravell謝謝 - 並感謝James的編輯,這已經非常多地回答了:) – Dave

1

只需使用一個readonly場:

private readonly string title; 

public Message(string title) { this.title = title; } 

編譯器will emit an error如果該字段是從其他地方分配。