Почему мы используем blank get; задавать; Аксессоры в С#?

Возможный дубликат:
С#: почему у вас есть пустое свойство get set вместо использования переменной public?

string name;

против

string name {get; set;}

Предполагая, что ваш get и set пустые, как указано выше, какой смысл их указывать?

Ответы

Ответ 1

Он инкапсулирует генерируемое компилятором поле и предоставляет разработчику class или struct возможность обновлять его позже, не нарушая ваш API, просто изменяя часть get/set, о которой вы заботитесь.

Например, внезапно никогда не хочется возвращать null? Вы можете сделать это, просто изменив пустой get на get { return storedName ?? ""; }. Конечно, это означает, что вам вдруг нужно вручную управлять переменной, но это небольшая цена, чтобы заплатить за гибкость.


Первое использование - это пример объявления . Второе использование - пример автоматически реализованного свойства.

Как правило, плохая практика обеспечивает прямой доступ к полю. Тем не менее, команда .NET заметила, что многие геттеры/сеттеры в основном такие. Например, рассмотрим следующее:

// C#
public string Name
{
    get { return name; }
    set { name = value; }
}

// Without properties (or a Java implementation)
public void setName(String name)
{
    this.name = name;
}

public String getName()
{
    return name;
}

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

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

Рассмотрим следующий пример:

public string Name
{
    get;
    set;
}

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

private string name;
public event NameChangingEventHandler NameChanging;
public event NameChangedEventHandler NameChanged;

public string Name
{
    get { return name; }
    set
    {
        OnNameChanging(/*...*/);
        name = value;
        OnNameChanged(/*...*/);
    }
}

protected virtual void OnNameChanging(/*...*/) { }
protected virtual void OnNameChanged(/*...*/) { }

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

(Несвязанный: потерянная мощность при наборе текста, и я очень рад, что мой браузер сохранил большую часть этого!)

Ответ 3

Первый, считая, что он объявлен в области класса, является именем поля. Он был доступен как поле. Второе свойство. Пустой get/set известен как авто-свойство.

Ответ 4

Возможно, вам понадобится сделать что-то в ваших аксессуарах в будущем. Изменение поля (которое является тем, что является вашим первым объявлением) для свойства, является нарушением изменений, поэтому заранее указать аксессоров - небольшая инвестиция в будущем.

Ответ 5

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

Но даже в этом случае еще одна очень веская причина только раскрывать свойства в ваших общедоступных интерфейсах: даже если вам никогда не нужно делать какие-либо внутренние обновления, использование полей может по-прежнему приводить к другим проблемам на линии, поскольку многие части .NET framework настоятельно предпочитает свойства для полей. WPF, например, обычно не поддерживает привязку к полям. Вы можете обойти это, выполняя причудливые вещи, такие как реализация ICustomTypeDescriptor, но просто гораздо проще просто набрать {get; установить;.}

Ответ 6

string name {get; set;}

Это называется автоматически реализованным свойством. На самом деле, С# создает переменную, начинающуюся с _ самой, поэтому на get, это значение переменной выбирается и устанавливается, это значение переменной установлено. Его как обычные свойства. Где string name; - это просто поле.

Ответ 7

Первая - это переменная, вторая - свойство (сокращенное)

Ответ 8

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

Если вы собираетесь открыть состояние, выведите его как свойство только для чтения (например, public widget Foo { get ; private set ; }).