Объявление Getter и Setter в .NET.

Мне было интересно, каковы различия между этими декларациями геттеров и сеттеров и если есть предпочтительный метод (и почему). Первая из них может быть сгенерирована автоматически с помощью Visual Studio. Как насчет других? Благодаря

первый

string _myProperty { get; set; }

второй

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

третий

string _myProperty;

public getMyProperty()
{
  return this._myProperty;
}

public setMyProperty(string value)
{
  this._myProperty = value;
}

Ответ 1

Свойства используются для инкапсуляции некоторых данных. Вы можете использовать простое поле:

public string MyField

Но это поле доступно для всех внешних пользователей вашего класса. Люди могут вставлять незаконные значения или изменять значение так, как вы этого не ожидали.

Используя свойство, вы можете инкапсулировать способ доступа к вашим данным. С# имеет хороший синтаксис для превращения поля в свойство:

string MyProperty { get; set; }

Это называется автоматически реализованным свойством. Когда возникнет такая необходимость, вы можете расширить свою собственность до:

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

Теперь вы можете добавить код, который проверяет значение в вашем setter:

set
{
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentNullException();

    _myProperty = value;
}

В свойствах также могут быть разные аксессоры для геттера и сеттера:

public string MyProperty { get; private set; }

Таким образом вы создаете свойство, которое может быть прочитано всеми, но может быть изменено только самим классом.

Вы также можете добавить полностью настраиваемую реализацию для getter:

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}

Когда С# компилирует ваше автоматически реализованное свойство, он генерирует промежуточный язык (IL). В вашем IL вы увидите метод get_MyProperty и set_MyProperty. Он также создает поле поддержки под названием <MyProperty>k_BackingField (обычно это было бы незаконным именем в С#, но в IL оно действительно. Таким образом, вы не получите никаких конфликтов между сгенерированными типами и вашим собственным кодом). Однако вы должны использовать официальный синтаксис свойства в С#. Это создает более приятный опыт работы на С# (например, с IntelliSense).

По соглашению, вы не должны использовать свойства для операций, которые занимают много времени.

Ответ 2

Ну, первая и вторая генерируют нечто вроде третьего в конце. Однако не используйте третий, если у вас есть синтаксис свойств.

Наконец, если у вас нет работы в get или set, используйте первый.

В конце концов, первая и вторая являются всего лишь формой синтаксического сахара, но почему код больше, чем нужно.

// more code == more bugs

И просто чтобы немного повеселиться, подумайте об этом:

public string A { get; private set; }

Теперь, когда намного более прямолинейно, не так ли? Модификатор public подразумевается как для get, так и для set, но может быть переопределен. Разумеется, это будет одно и то же правило для любого модификатора, используемого при определении самого свойства.

Ответ 3

первый

string _myProperty { get; set; }

Это называется Авто свойство в мире .NET. Это просто синтаксический сахар для № 2.

второй

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

Это обычный способ сделать это, что требуется, если вам нужно сделать какую-либо проверку или дополнительный код в свойстве. Например, в WPF, если вам нужно запустить Событие с измененным свойством. Если вы этого не сделаете, просто используйте свойство auto, это довольно стандартно.

3

string _myProperty;

public string getMyProperty()
{
    return this._myProperty;
}

public string setMyProperty(string value)
{
    this._myProperty = value;
}

Ключевое слово this здесь избыточно. Не нужно вообще. Это всего лишь методы, которые получают и устанавливают в отличие от свойств, таких как способ выполнения Java.

Ответ 4

Чтобы уточнить, в вашем третьем примере _myProperty на самом деле не является свойством. Это поле с методами get и set (и, как уже упоминалось, методы get и set должны указывать типы возвращаемых данных).

В С# в большинстве ситуаций следует избегать 3-го метода. Вы бы действительно использовали его, только если тип, который вы хотели вернуть, был массивом, или если метод get выполнял большую работу, а не просто возвращал значение. Последнее не является действительно необходимым, но с целью ясности метод получения свойства, который делает большую работу, вводит в заблуждение.

Ответ 5

С этим вы можете выполнить некоторый код в области get или set.

private string _myProperty;
public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

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

public string myProperty
{
    get;
    set;
}

И .NET Framework справится с вами. Это было создано, потому что это хорошая оценка и облегчение.

Вы также можете контролировать видимость этих областей, для образца:

public string myProperty
{
    get;
    private set;
}

public string myProperty2
{
    get;
    protected set;
}

public string myProperty3
{
    get; 
}

Update

Теперь в С# вы можете инициализировать значение свойства. Для образца:

public int Property { get; set; } = 1;

Если также можно определить его и сделать его только для чтения, без набора.

public int Property { get; } = 1;

И, наконец, вы можете определить функцию стрелки.

public int Property { get; } => GetValue();

Ответ 6

1-й по умолчанию, когда нет ничего особенного для возврата или записи. 2-й и 3-й, в основном, то же самое, где 3rd - это бит более расширенная версия 2-го

Ответ 7

Давайте начнем с 3. Это не сработает. public getMyProperty() не имеет возврата.

И цифры 1 и 2 на самом деле одинаковы. 2 - это то, что после компиляции становится номером 1.

Итак, 1 и 2 - это то же самое. с двумя вы можете иметь некоторую проверку или кэширование в своей модели.

кроме того, что они становятся такими же.

Ответ 8

Первая - это "короткая" форма - вы ее используете, когда не хотите делать что-то свое с вашими геттерами и сеттерами. Невозможно выполнить метод или что-то подобное в этой форме.

Вторая и третья формы почти идентичны, хотя вторая сжимается до одной строки. Эта форма обескуражена стилем, потому что она выглядит несколько странно и не соответствует C 'Stylguides.

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