2012-10-29 136 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如果该字段是从其他地方分配。