суббота, 1 января 2022 г.

Get Set

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" и есть передаваемое в свойство value

person.Name = "Tom";
 
// Получаем значение свойства и присваиваем его переменной - срабатывает блок Get

string personName = person.Name;

Console.WriteLine(personName);  // Tom
 
class 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 до 120
Console.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

Таким образом, свойство позволяет опосредовать и контролировать доступ к данным объекта.

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...