2

クラスに静的メンバー変数がある場合、どこで初期化し、そのすべてのプロパティを設定する必要がありますか?

class Foo
{
    static public Timer t;
    private int foo;

    public Foo(int f)
    {
        this.foo = f;
    }
}

ご覧のとおり、私のクラスにはprivate int foo、コンストラクターのパラメーターと一致するように設定されたメンバー変数があります。またstatic public Timer t、このクラスのインスタンスごとにどれがカチカチ音をたてるべきかを取得しました。今私の質問は、このコードをどこに追加すればよいかです:

t = new Timer();
t.Interval = 1;

クラスのコンストラクターに追加すると、新しいインスタンスが作成されるたびに呼び出されるため、これは私が望んでいるものではありません。t = new Timer();次のように実際の変数宣言に移動できますstatic public Timer t = new Timer();が、それでもt.Interval = 1;どこかに挿入する必要があります。

問題は、新しいインスタンスを作成するたびにではなく、静的メンバーを初期化する方法と、そのプロパティを編集する方法です。

4

5 に答える 5

3

他のほとんどの返信とは少し異なるアドバイスを提供します。

可能であれば静的コンストラクターは避けるべきだと言っています。

その理由は効率の1つです。詳細は複雑すぎてここに入ることができませんが、詳細については次のページを参照してください。

http://ericlippert.com/2013/02/06/static-constructors-part-one/

http://blogs.msdn.com/b/brada/archive/2004/04/17/115300.aspx?Redirected=true

正直なところ、心配することはそれほど多くありませんが、静的コンストラクターを回避するのは非常に簡単なので、おそらくそうする必要があります。

あなたがすることはあなたがあなたの静的フィールドを初期化することができる値を返す静的メソッドを書くことです。

タイマーの例では、次のようになります。

private static Timer _timer = InitTimer();

private static Timer InitTimer()
{
    Timer result = new Timer {Interval = 100};
    return result;
}

このような単純な初期化の場合でも、別のメソッドを作成する必要はありません。これを実行できるからです。

private static Timer _timer = new Timer {Interval = 100};

ただし、より複雑な状況では、静的メソッドを作成できます。

于 2013-02-28T12:06:37.343 に答える
2

次のように、このコードをStatic Constructorに追加できます。

static Foo()
{
    t = new Timer();
    t.Interval = 1;
}

MSDN から:

静的コンストラクターは、静的データを初期化するため、または一度だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます

于 2013-02-28T11:57:03.707 に答える
2

これには静的コンストラクターが使用されます。

于 2013-02-28T11:57:12.280 に答える
1

静的コンストラクターがあります。このように呼び出します

class Foo {

static Foo(){
// initialize your timer here
}

ここを参照してください。

于 2013-02-28T11:57:30.940 に答える
0

これを行うには、次の 2 つの方法があります。

初期化子

static public Timer t = new Timer
{
    Interval = 1
};

静的コンストラクター

static public Timer t;

static Foo
{
    t = new Timer();
    t.Interval = 1;
}
于 2013-02-28T11:59:35.470 に答える