Почему у вас есть пустое свойство get set вместо использования переменной public?
Возможный дубликат:
С#: открытые поля и автоматические свойства
Duplicate? Я не думаю:
Этот вопрос не совпадает с" Почему использовать свойства вместо общедоступных поле ". Свойство с указанным геттер и сеттер сильно отличаются чем общественное поле. Мой вопрос был, это свойство БЕЗ геттера и сеттер, любой другой.
С несколько недавней возможностью иметь пустые геттеры и сеттеры, в чем преимущество использования их вместо простого объявления переменной public?
Пример:
public string MyProperty
{
get;
set;
}
против
public string MyProperty;
Ответы
Ответ 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, которые влияют на сериализацию, атрибут не может применяться к полям и т.д.
По общему признанию, нет ничего технически, чтобы эти атрибуты не использовались для членов, но тем не менее они работают только с свойствами.