Подтвердить что ты не робот

Почему у вас есть пустое свойство get set вместо использования переменной public?

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

Duplicate? Я не думаю:
Этот вопрос не совпадает с" Почему использовать свойства вместо общедоступных поле ". Свойство с указанным геттер и сеттер сильно отличаются чем общественное поле. Мой вопрос был, это свойство БЕЗ геттера и сеттер, любой другой.

С несколько недавней возможностью иметь пустые геттеры и сеттеры, в чем преимущество использования их вместо простого объявления переменной public?

Пример:

public string MyProperty
{
    get;
    set;
}

против

public string MyProperty;
4b9b3361

Ответ 1

Одно слово: наследование.

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

Так же:

public class Foo {
  public virtual int MyField = 1; // Nope, this can't

  public virtual int Bar {get; set; }
}

public class MyDerive : Foo {
  public override MyField; // Nope, this can't

  public override int Bar {
    get {
      //do something;
    }
    set; }
}

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

Ответ 2

Одна вещь, которую вы можете сделать с свойствами, которые вы не можете делать с полями, - это ограниченная видимость для сеттера или получателя:

public string MyProperty { get; private set; }

Что-то я использую довольно много.

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

public interface MyInterface
{
    string MyProperty { get; }
}

Обратите внимание, что здесь нет необходимости устанавливать сеттер. Это полностью зависит от реализации классов, чтобы определить, как они должны установить MyProperty.

Ответ 3

Поля не отображаются в интерфейсах. И свойство auto может быть изменено в "нормальное" свойство в любое время, если это необходимо, без изменения подписи и интерфейса класса.

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

Ответ 4

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

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

Ответ 5

Свойство дает вам несколько преимуществ перед простым публичным полем:

  • вы можете контролировать, является ли свойство доступным только для чтения, только для записи или чтения/записи.
  • вы можете скрыть фактическую реализацию (возможно, в установщике, который вы хотите сделать больше, чем просто установление значения)
  • при использовании привязки данных (например, в ASP.NET) вам придется использовать свойства (не работает с полями)

Ответ 6

Идея состоит в том, чтобы управлять значениями внутри объекта, состояния, избегать коррупции и неправильного использования, вызывая код.

Ответ 7

Вы можете отмечать свойства с атрибутами, недоступными для членов. Существуют атрибуты, которые применяются только к полям в пространстве имен DataContract, которые влияют на сериализацию, атрибут не может применяться к полям и т.д.

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