web-dev-qa-db-ja.com

静的プロパティのデフォルト値

私はc#が好きですが、なぜ私はできるのですか:

public static bool Initialized { private set; get; }

またはこれ:

public static bool Initialized = false;

しかし、1行に両方が混在していない?

変数にアクセスレベルを設定するだけで(プライベートセット)、起動時にfalseに設定する必要があります。私は、その退屈なプライベート_Initialized変数を作成したくありません。これは、パブリックInitialized varのgetterによって返されます。私は自分のコードが美しいことが好きです。 (注意:変数は静的で、コンストラクターで初期化できません)。

ありがとう

45
Blitzz

静的コンストラクター を使用できます

static MyClass()
{
    Initialized = false;
}

ただし、他の人が述べたように、boolのデフォルト値はfalseです。

53
Corey Sunwold

C#6以降:

public static bool Initialized { private set; get; } = false;
18
Mehrdad Mirreza

あなたはただすることができます:

public static bool Initialized { private set; get; }

bool値はデフォルトで常にfalseであるため、初期化する必要はありません。

これをデフォルトでtrueにする必要がある場合、またはより複雑なロジックを使用する場合は、静的コンストラクターでこれを行うか、バッキングフィールドを使用する必要があります。

「私は自分のコードが美しいことを望んでいます」-個人的に、デフォルト以外の初期化については、これはちょうど「美しい」と思います:

private static bool initialized = true;
public static bool Initialized { get { return initialized; } }

これにより、デフォルト以外への初期化が非常にわかりやすくなりますが、これは悪いことではありません。

6
Reed Copsey

言及した2つのコードブロックは、2つの異なるものです。

最初のブロックは 自動実装プロパティ定義 です。これは、次のような完全なプロパティ定義の構文糖衣です。

private static bool _initialized;
public static bool Initialized
{
    private set
    {
        _initialized = value;
    }
    get
    {
        return _initialized;
    }
}

コードの2番目のブロックは、 静的メンバー定義 です。上記の拡張を見ると、プライベートな静的メンバー定義が含まれていることがわかります。初期値を提供する場合は、ここで実行できます。

private static bool _initialized = false;
public static bool Initialized
{
    private set
    {
        _initialized = value;
    }
    get
    {
        return _initialized;
    }
}

使用しているインラインプロパティ定義は、最も一般的な場合にコードを少し短くするために設計されました。他に何かをしたい場合は、プロパティコードの完全な形式を使用できます。

または、まったく異なるルートをたどって静的コンストラクターを使用することもできます。 ( Coreyの答え を参照)

3
Simon P Stevens