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