VirQ. Свойства классов, get, set в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная /
Учебник
/
Свойства классов, get, set
Статей на сайте: 61

Свойства классов, get, set


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

Вот вам 2 варианта, которые отличают поля от свойств:
Так выглядят поля
[code] class Rectangle { public double a; public double b; public Rectangle(double sideA, double sideB) { a = sideA; b = sideB; } } [/code]
Так выглядят свойства, связанные с полями
[code] class Rectangle { double a; double b; public double A { get { return a; } set { a = value; } } public double B { get { return b; } set { b = value; } } public Rectangle(double sideA, double sideB) { A = sideA; B = sideB; } } [/code]
Так выглядят автоматические свойства
[code] class Rectangle { public double A { get; set; } public double B { get; set; } public Rectangle(double sideA, double sideB) { A = sideA; B = sideB; } } [/code]
Давайте по шагам всё разберём. Уберём другую переменную "b", уберём конструктор и рассмотрим без всего лишнего:
[code] class Rectangle { double a; } [/code]
В данном случае у нас класс Rectangle имеет только одно поле "а". В коде его видно не будет, т.к. нет клювевого слова public перед double
Введя данные вы увидите это:


Если добавить public:
[code] class Rectangle { public double a; } [/code]
то убрав точку из кода и введя её вновь вы заметите изменения:


При использовании свойств поле должно быть скрытым (без public), а свойство обязательно открытым (public). И принято, что пишется свойство с большой буквы
[code] class Rectangle { double a; public double A { get { return a; } set { a = value; } } } [/code]
Теперь убрав точку и вновь её введя, вы увидите изменение иконки:


Само свойство выглядит так:
[code] public double A { get { return a; } set { a = value; } } [/code]
Оно состоит из 2 частей
get - получение данных из поля
set - установка данных в поле извне

Свойство - это промежуточный фильтр между кодом
[code] Rectangle r = new Rectangle(); r.A = 15; [/code]
и полем класса, которое скрыто.
Когда вы пишете r.A = 15, срабатывает set {a = value;}, где в value как раз хранится число 15. А "а" - это наше поле.
Если вы хотите получить значение этого поля, например так:
[code] Rectangle r = new Rectangle(); double z = r.A; [/code]
тогда срабатывает get { return a; }, что означает - вернуть (показать) результат поля "а".

Ну и теперь о самом фильтре.
То, чтобы было объяснено выше - смысла не имеет, пока мы не пропишем условия ввода.
Обычно для get { return a; } ничего не будет меняться.
А вот для set мы внесём изменения. Например, сторона прямоугольника не может быть отрицательным числом.
Теперь, когда понятна структура записи свойств, запишем 2 стороны (2 поля и 2 свойства)
[code] class Rectangle { double a; public double A { get { return a; } set { if (value < 0) throw new Exception("Значение стороны А не может быть отрицательным"); a = value; } } double b; public double B { get { return b; } set { if (value < 0) throw new Exception("Значение стороны В не может быть отрицательным"); b = value; } } } [/code]
Код throw new Exception вызывает окно с текстом ошибки.
Если вы попробуете внести отрицательное число
[code] Rectangle r = new Rectangle(); r.A = 11; r.B = -6; [/code]
то в поле "b" ничего дойти не сможет, т.к. будет вызвана ошибка



Чтобы ещё ярче описать необходимость свойств, добавим площадь и периметр.
Полей тут вообще тогда быть не должно для них. Только свойства. А поэтому блок set тут вообще не нужен (см. внизу):
[code] class Rectangle { double a; public double A { get { return a; } set { if (value < 0) throw new Exception("Значение не может быть отрицательным"); a = value; } } double b; public double B { get { return b; } set { if (value < 0) throw new Exception("Значение не может быть отрицательным"); b = value; } } public double P { get { return a + b; } } public double S { get { return a * b; } } } [/code]


Тогда при обращении к свойству P или S мы получаем периметр или площадь.
А при попытке изменить значения этих свойств приведут к ошибке
(первые 4 строки с обращением к свойствам - верные, 5-я строка - ошибка)


Вы не можете изменить значение площади и периметра прямым способом. Это вычисляемые значения из сторон "а" и "b".

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

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

Дополнительная информация о том, как вывести результат в консоли или WinForm