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

2 回答 2

4

您要求的是自定义编译器规则,AFAIK 是不可能的。IMO你有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属性都只会设置一次。

于 2012-10-29T10:22:16.960 回答
1

只需使用一个readonly字段:

private readonly string title;

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

如果从其他任何地方分配该字段,编译器将发出错误。

于 2012-10-29T10:49:51.213 回答