C#: я могу удалить "{ get; set; }"?
Есть ли разница между:
public T RequestedValue { get; set; }
а также
public T RequestedValue;
?
Взятые из этого кода:
public class PropertyChangeRequestEventArgs<T>:EventArgs
{
public PropertyChangeRequestEventArgs(T pRequestedValue)
{
RequestedValue = pRequestedValue;
}
public T RequestedValue { get; set; }
}
4 ответа
Первый - это автоматически реализуемое свойство, второй - поле. Обычные свойства предоставляют методы получения и установки, но имеют личное поле для фактического хранения значения:
private int someProperty;
public int SomeProperty
{
get { return someProperty; }
set { someProperty = value; }
}
Первый позволяет вам изменять определенные аспекты реализации вашего класса, не затрагивая весь другой код в вашем приложении. Наиболее важным моментом является то, что со свойствами изменения могут быть сделаны без нарушения бинарной совместимости (хотя поле часто можно изменить на свойство без нарушения кода). Если это публичный член, рекомендуется недвижимость. (Бесстыдно воровать из комментария Снарфблама)
Со страницы свойств:
Свойства - это члены, которые предоставляют гибкий механизм для чтения, записи или вычисления значений приватных полей. Свойства можно использовать так, как будто они являются открытыми членами данных, но на самом деле это специальные методы, называемые методами доступа. Это позволяет легко получать доступ к данным, а также способствует безопасности и гибкости методов.
Свойства с полем поддержки являются наиболее гибкой формой, поскольку они позволяют легко реализовать такие вещи, как INotifyPropertyChanged
событие для обновления пользовательского интерфейса в реализациях Model-View-ViewModel.
глубокое объяснение!
{Получить; set;} - это автоматическое свойство, а второе - поле.
поле - это нормальная переменная какого-то типа, содержащая данные.
свойство - это пара методов (иногда это только один), один для получения и один для набора. они имеют только синтаксис, подобный полям, но на самом деле они совершенно разные.
свойства обычно предназначены для фильтрации набора значений или виртуализации чего-либо в get и т. д.
автоматические свойства, также создают закрытое поле за кулисами, возвращают его значение в get и устанавливают его значение в наборе.
На первый взгляд, это похоже на обычное поле, но скрытое использование свойств (IL) полностью отличается от использования полей.
a.Property1 = 4;
это перевести в нечто вроде:
a.Set_Propert1(4);
и это:
x = a.Property1;
это перевести на что-то вроде этого:
x = a.Get_Property1();
так почему стоит использовать только открытые свойства, даже если они автоматические?
скажем, вы пишете библиотеку, которая используется другим приложением, и когда-нибудь вы захотите выпустить новую версию этой библиотеки, которая ограничивает одно из полей вашего класса.
если вы используете свойства, вы можете просто изменить свойство (даже если оно автоматическое, вы можете заменить его на полное), и тогда любое приложение, использовавшее вашу библиотеку, может использовать его таким же образом.
но если вы создали открытое поле, которое теперь хотите ограничить, вам нужно будет создать для него свойство и сделать поле приватным, но если вы это сделаете, любое приложение, которое использовало вашу библиотеку, больше не будет связываться, потому что способ, которым это использует поля и свойство, отличается.
Вы можете написать:
public T RequestedValue { get; set; }
как ярлык:
private T _requestedValue;
public T RequestedValue
{
get { return this._requestedValue; }
set { this._requestedValue = value; }
}
Они полностью эквивалентны, также учитывая производительность.
Ответ: да, вы можете удалить {получить; задавать; } но тогда вся нагрузка обнаруживает незначительные различия. Некоторые скажут, что поля и свойства выражают радикально разные намерения проекта, но на практике это различие стиралось в течение многих лет, поскольку C# развивается и постепенно размывает синтаксические различия.
Хороший список различий уровня компилятора в двоичном коде между полями и свойствами см. В разделе "Вопрос о разнице между свойством и полем в c". Но ответы на этот вопрос упустили один важный момент, касающийся особой роли свойств при объявлении интерфейсов.