1

グローバル変数の中には、一度だけ開始する必要があるものがあります。ファイルをロードして、それらを何でも設定することでそれを行います。この変数に新しい値を設定しようとすると、例外がスローされるようになりました。

public class Foo
{
    public static int MIN;

    private static loadConstants()
    {
        MIN = 18;
    }

    public static void Main()
    {
        loadConstants();
        MIN = 15; // this must throw an exception
        // edit: at least mustn't set the new value
    }
}

どうやってやるの ?

(おそらく非常に簡単で申し訳ありません)

4

4 に答える 4

6

静的コンストラクターを作成し、変数を読み取り専用としてマークします。次に、コンストラクターで値を設定します。

public static class Foo
{
    public static readonly int MIN;

    static Foo()
    {
        MIN = 18;
    }

    public static void Main()
    {

    }
}
于 2013-06-05T13:24:18.650 に答える
3
public class Foo
{
    public readonly static int MIN;

    static Foo()
    {
        MIN = 18;
    }

    public static void Main()
    {
    }
}
于 2013-06-05T13:25:44.250 に答える
2

他の回答の static-constructor を使用できない、または使用したくない場合 (たとえば、変数を実際に初期化する前に型を使用することがたくさんあるため、または静的コンストラクターが本当に苦痛であることを理解しているため)デバッグする..) あなたは他のことをすることができます:


コンパイル時の解決策の 1 つは、変数を非静的読み取り専用として独自の型にパックし、この型への静的参照を保持することです。

public class Constants
{
    public readonly int MIN;
    public Constants() { MIN = 18; }
}
public class Foo
{
    public static Constants GlobalConstants { get; private set; }

    public static void Main()
    {
        // do lots of stuff
        GlobalConstants = new GlobalConstants();
    }
}

または、定数をプロパティにして、クラス外のユーザーにのみゲッターを提供することもできます。宣言クラスは引き続きプロパティを変更できることに注意してください。

public class Foo
{
    public static int MIN { get; private set; } }

    public static void Main()
    {
        MIN = 18;
        MIN = 23; // this will still work :(
    }
}

または、何らかの奇妙な理由で、コンパイルエラーではなく例外が本当に必要な場合は、定数からプロパティを作成し、セッターで例外をスローできます。

public class Foo
{
    static int _min;
    public static int MIN { get { return _min; } set { throw new NotSupportedException(); } }

    public static void Main()
    {
        _min = 18;
    }
}
于 2013-06-05T13:38:18.637 に答える