创建编译错误而不是运行时错误

时间:2012-10-29 10:15:07

标签: c# compiler-errors runtime-error

我的代码需要设置我的类的字段,但我希望字段只设置一​​次。如果开发人员试图重置/更改它,我理想情况下编译器会告诉我们而不是获取运行时错误。这可能吗?

帮助解释的代码

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!");
            }
        }
    }

如您所见,上面将抛出异常,但这是运行时错误。虽然这里的示例相当简单,但编写编译器错误或警告消息的概念可能非常有用。

2 个答案:

答案 0 :(得分: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属性都只会被设置一次。

答案 1 :(得分:1)

只需使用readonly字段:

private readonly string title;

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

编译器will emit an error,如果该字段是从其他任何地方分配的。