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

あなたが求めているのは、知る限り不可能なカスタムコンパイラルールです。IMOには2つのオプションがあります。1つは、コンストラクターの一部にすることで、一度しか設定できないようにすることです。

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

    public string Title { get; private set; }
}

もう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 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 に答える