значение по умолчанию для статического свойства - PullRequest
45 голосов
/ 08 апреля 2010

Мне нравится c #, но почему я могу сделать:

public static bool Initialized { private set; get; }

или это:

public static bool Initialized = false;

а не сочетание обоих в одной строке?

Мне просто нужно установить уровень доступа к моей переменной (частный набор), и мне нужно, чтобы при запуске он был равен false. Я не хотел бы делать ту скучную частную переменную _Initialized, которая будет возвращена получателем общедоступной переменной Initialized. Мне нравится мой код, чтобы быть красивым. (Примечание: моя переменная статическая, ее нельзя инициализировать в конструкторе).

Спасибо

Ответы [ 4 ]

53 голосов
/ 08 апреля 2010

Вы можете использовать статический конструктор

static MyClass()
{
    Initialized = false;
}

Однако, как уже упоминалось другими, значение bool по умолчанию будет ложным.

16 голосов
/ 20 мая 2015

С C # 6:

public static bool Initialized { private set; get; } = false;
6 голосов
/ 08 апреля 2010

Вы можете просто сделать:

public static bool Initialized { private set; get; }

Так как bool значения по умолчанию всегда ложны, его не нужно инициализировать.

Если вам нужно, чтобы это было по умолчанию или иметь более сложную логику, вам нужно сделать это в статическом конструкторе или использовать вспомогательное поле.

Что касается "мне нравится, что мой код красив" - лично, для инициализации не по умолчанию, я думаю, что это так же "красиво":

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

Это делает инициализацию не по умолчанию очень заметной, что неплохо.

3 голосов
/ 08 апреля 2010

Два упомянутых вами блока кода - это две разные вещи.

Первый блок - это автоматически реализованное определение свойства .Это синтаксический сахар для определения полного свойства, которое выглядит следующим образом:

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

Ваш второй блок кода - это определение статического члена .Если вы посмотрите на расширение, которое я дал выше, вы заметите, что оно включает определение частного статического члена.Если вы хотите указать начальное значение, вы можете сделать это здесь:

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

Используемое вами определение встроенного свойства было разработано только для того, чтобы сделать код немного короче в наиболее распространенном случае.Если вы хотите сделать что-то еще, вы можете использовать полную форму кода свойства.

В качестве альтернативы, вы можете пойти по совершенно другому маршруту и ​​использовать статический конструктор.(См. ответ Кори )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...