Найти в Дзене
"Мы"-Прогер

Изучаем C# - Свойства, геттеры и сеттеры

В предыдущей статье https://dzen.ru/a/aZ7YnxBR5GpuouEh?share_to=link мы разобрали пример класса с инкапсуляцией - координата "_x" животного могла изменяться только изнутри класса, она была защищена от изменений снаружи модификатором private. Однако, чтобы мы могли узнать координату, пришлось добавлять отдельный метод GetX(). Если бы мы могли сказать, что изменение координаты возможно только private, а чтение - public, проблемы бы не возникло. На самом деле, в подобных ситуациях используют свойства. Свойство в C# - это специальное поле, которое имеет два метода - для установки нового значения и для считывания. Метод для установки нового значения называется set (сеттер), а для считывания - get (геттер). Поскольку методы для установки и считывания значения разные, то мы можем объявить их с разными модификаторами доступа: Здесь установка нового значения возможна только изнутри класса (private), в то время как для считывания оно видно отовсюду (public, не пишется). Синтаксис установки и счи
Оглавление

В предыдущей статье https://dzen.ru/a/aZ7YnxBR5GpuouEh?share_to=link мы разобрали пример класса с инкапсуляцией - координата "_x" животного могла изменяться только изнутри класса, она была защищена от изменений снаружи модификатором private.

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

Что такое свойство в C#

Свойство в C# - это специальное поле, которое имеет два метода - для установки нового значения и для считывания. Метод для установки нового значения называется set (сеттер), а для считывания - get (геттер).

Поскольку методы для установки и считывания значения разные, то мы можем объявить их с разными модификаторами доступа:

-2

Здесь установка нового значения возможна только изнутри класса (private), в то время как для считывания оно видно отовсюду (public, не пишется). Синтаксис установки и считывания значения такой же, как у полей - просто через объект1.Свойство, скобки не пишут, а сеттер и геттер вызываются автоматически:

-3
-4

Благодаря этому мы всегда можем легко заменить поле на свойство, а менять места его использования не потребуется.

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

-5

Здесь мы реализовали свои сеттер и геттер, и поэтому нам пришлось хранить значение в отдельном поле _x. Теперь при каждом доступе к координате печатаются сообщения в консоль. Обратите внимание, что новое значение, которое мы хотим установить в сеттере, хранится в служебной переменной value. Также у сеттера и геттера нет круглых скобок, свойственных методам.

Обычно сеттеры и геттеры используются либо для разделения доступа private/public, как в нашем случае, либо для валидации (проверки) устанавливаемых значений. Например, сумма денег должна быть всегда >= 0:

-6

Если сеттер или геттер содержит только одну команду, то её можно написать через стрелку:

-7

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

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

-8

Эту запись обычно сокращают до

-9

Наконец, всевозможные библиотеки на C# часто работают только со свойствами и не работают с полями.

Далее

Наследование и полиморфизм в ООП - https://dzen.ru/a/aaA_nATXB1nT9t4d?share_to=link

Оглавление - https://dzen.ru/a/aXisxwt_Mnz2qTjs?share_to=link