Get - Set свойства.
Блоки get и set еще называются акссесорами или методами доступа (к значению свойства), а также геттером и сеттером.
Они обеспечивают простой доступ к полям классов и структур.
В блоке get выполняются действия по получению значения свойства. В этом блоке с помощью оператора return возвращаем некоторое значение.
В блоке set устанавливается значение свойства. В этом блоке с помощью параметра value мы можем получить значение, которое передано свойству.
То есть по сути свойство ничего не хранит, оно выступает в роли посредника между внешним кодом и переменной name.
Рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | Person person = new Person();// Устанавливаем свойство - срабатывает блок Set// значение "Tom" и есть передаваемое в свойство valueperson.Name = "Tom";// Получаем значение свойства и присваиваем его переменной - срабатывает блок Getstring personName = person.Name;Console.WriteLine(personName); // Tomclass Person{ private string name = "Undefined"; public string Name { get { return name; // возвращаем значение свойства } set { name = value; // устанавливаем новое значение свойства } }} |
Здесь в классе Person определено приватное поле name, которая хранит имя пользователя, и есть общедоступное свойство Name.
Хотя они имеют практически одинаковое название за исключением регистра, но это не более чем стиль, названия у них могут быть произвольные и не обязательно должны совпадать.
Через это свойство мы можем управлять доступом к переменной name.
В свойстве в блоке get возвращаем значение поля:
1 | get { return name; } |
А в блоке set устанавливаем значение переменной name. Параметр value представляет передаваемое значение, которое передается переменной name.
1 | set { name = value; } |
В программе мы можем обращаться к этому свойству, как к обычному полю. Если мы ему присваиваем какое-нибудь значение, то срабатывает блок set, а передаваемое значение передается в параметр value:
1 | person.Name = "Tom"; |
Если мы получаем значение свойства, то срабатывает блок get, который по сути возвращает значение переменной name:
1 | string personName = p.Name; |
Возможно, может возникнуть вопрос, зачем нужны свойства, если мы можем в данной ситуации обходиться обычными полями класса?
Но свойства позволяют вложить дополнительную логику, которая может быть необходима при установке или получении значения.
Например, нам надо установить проверку по возрасту:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Person person = new Person();Console.WriteLine(person.Age); // 1// изменяем значение свойстваperson.Age = 37;Console.WriteLine(person.Age); // 37// пробуем передать недопустимое значениеperson.Age = -23; // Возраст должен быть в диапазоне от 1 до 120Console.WriteLine(person.Age); // 37 - возраст не изменилсяclass Person{ int age = 1; public int Age { set { if (value < 1 || value > 120) Console.WriteLine("Возраст должен быть в диапазоне от 1 до 120"); else age = value; } get { return age; } }} |
В данном случае переменная age хранит возраст пользователя. Напрямую мы не можем обратиться к этой переменной - только через свойство Age. Причем в блоке set мы устанавливаем значение, если оно соответствует некоторому разумному диапазону. Поэтому при передаче свойству Age значения, которое не входит в этот диапазон, значение переменной не будет изменяться:
1 | person.Age = -23; |
1 37 Возраст должен быть в диапазоне от 1 до 120 37
Таким образом, свойство позволяет опосредовать и контролировать доступ к данным объекта.
Комментариев нет:
Отправить комментарий