Почему нет начальных значений в методах доступа {get; set;} (VS 2010 C #) - PullRequest
4 голосов
/ 16 июля 2010

Это, должно быть, задавали много раз, но я не могу найти его ... извините ...

Почему следующее не разрешено?

публичная строка MyString = "начальное значение" {get; приватный набор;}

(Visual C # Express 2010)

Ответы [ 6 ]

5 голосов
/ 16 июля 2010

Это просто неверный синтаксис. Вы не можете инициализировать значение авто-свойства, к сожалению.

Наилучшим вариантом является создание свойства вручную:

private string _MyString = "initial value";
public string MyString { get { return _MyString; } set { _MyString = value; } }

или инициализировать значение в конструкторе:

public string MyString { get; set; }

....

public MyClass() {
    MyString = "initial value";
}
2 голосов
/ 16 июля 2010

Альтернатива:

string _strMyString;

public string MyString
{
    get {
        if (String.IsNullOrEmpty(_strMyString) {
             return "initial value";
        } else { 
             return _strMyString; 
        }
}
1 голос
/ 01 апреля 2017

В VS 2017 вы можете:

    public int Minimum { get; private set; } = 0;
    public int Maximum { get; set; } = 5;
1 голос
/ 16 июля 2010

Почему?

Я не могу говорить от имени разработчиков C #, но могу выдвинуть обоснованные предположения:

  1. Они хотели увидеть, какЭто очень важно, прежде чем потратить время на добавление еще одной функции и еще одного правила к языку.
  2. Они не смогли найти достаточно элегантно выглядящий способ сделать это.

Тем не менее, вот как я бы разрешил значения (когда, конечно, доступен аксессор набора):

public string MyProp {get;set;} = "initial value"; // not valid C#

Не усложняя язык, они могли бы написатьПравило так, что оно применяется к «[всем] свойствам с установленными средствами доступа» вместо «свойств по умолчанию с установленными средствами доступа»:

// again, not valid C#:
public string MyProp
{
    get { return _MyProp;}
    set { _MyProp = value; }
} = "initial value before being massaged or rejected by the set accessor.";

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

1 голос
/ 16 июля 2010

синтаксис

public string MyString { get; set; }

заменяет старый стиль / раздражающий / тривиальный (начиная с версии 2008 / c # 3.0 вы можете увидеть все новые функции c # 3.0 здесь )

private string _MyString;

public string MyString 
{
    get { return _MyString; }
    set { _MyString = value; }
}

компилятор фактически генерирует член перед компиляцией вашего кода. Вы можете открыть отражатель и увидеть созданный элемент.

1 голос
/ 16 июля 2010

Это свойство, а не поле. Вы не можете инициализировать это таким образом. Просто установите значение в конструкторе.

...