Урок № 18. Свойства (Properties). Часть 1


Свойства (Properties). Часть 1

Доброго времени суток! В прошлом уроке мы говорили о таких понятиях ООП, как класс, объект, методы и поля классов. Мы рассмотрели использование методов в качестве открытой части классов, т.е. как некий интерфейс доступа к объектам. Таким образом, поля класса делались закрытыми для «внешнего мира», и все действия над объектом и его состоянием осуществлялись с помощью методов! Но с таким подходом, нам нужно создавать по два метода для каждого поля, плюс синтаксис использования методов немного громоздкий. К счастью, в C# есть механизм свойств (properties). Свойства (properties), в данном случае, занимают промежуточное положение между полями и методами. Синтаксически, использование свойств выглядит как использование полей, но по функциональности свойства схожи с методами.

Каждое свойство может иметь два так называемых метода доступа, и как раз таких как нам нужно, один для установки значения поля (метод set), а другой для получения (метод get). А теперь, давайте посмотрим, как это работает на практике. Но для начала вспомним пример из предыдущего урока, когда мы создавали по два отдельных метода на каждое поле:

//Класс, описывающий простого студента
class Student
{
    //Возвращает значение поля name
    public string GetName() { return name; }
    //Возвращает значение поля grade
    public uint GetGrade() { return grade; }
    //Устанавливает значение поля name
    public void SetName(string aName)
    {
        name = aName;
    }
    //Устанавливает значение поля grade
    public void SetGrade(uint aGrade)
    {
        grade = aGrade;
    }

    //Поля класса
    private string name; //Имя студента
    private uint grade;  //Курс
}

А теперь посмотрим, как будет выглядеть класс «Student», если мы заменим методы на свойства:

//Класс, описывающий простого студента
class Student
{
    //Свойство, для доступа к полую "name"
    public string Name
    {
        //Возвращает значение
        get { return name; }
        //Устанавливает значение
        set { name = value; }
    }

    //Свойство, для доступа к полую "grade"
    public uint Grade
    {
        //Возвращает значение
        get { return grade; }
        //Устанавливает значение
        set { grade = value; }
    }

    //Поля класса
    private string name; //Имя студента
    private uint grade;  //Курс
}

Теперь, вместо пары отдельных методов (для установки и получения значения), мы используем одно свойство, в котором заключена их функциональность.

Давайте подробно разберем как создаются свойства! А делается это по следующим правилам: сначала указывается модификатор доступа, после него, через пробел, указывается тип возвращаемого/устанавливаемого значения, за ним (тоже через пробел) – название свойства, а после названия – в фигурных скобках следует тело свойства.

[модификатор доступа] [тип значения] [Название]
{
    //Тело свойства
}

А тело свойства может состоять из двух методов доступа, get для возврата значения и set для установки.

Свойство может иметь как оба метода (и get и set), так и только один (любой из них).

Метод get очень прост, но он должен возвращать значение по типу, совпадающее с типом свойства. В самом простом случае (а точнее в большинстве случаев), метод get выглядит примерно так:

get { retrun name; } //Где name – имя поля класса

А вот метод set имеет свою особенность, в нем доступно особое значение (по типу, совпадающее с типом свойства) это то значение, которое указал программист (пользователь класса) при использовании свойства в своем коде. Это значение, внутри метода set, можно получить, используя ключевое слово  value.

А теперь, давайте посмотрим, как использовать свойства на реальных объектах класса «Student»:

//Задаем значения полей объекта
ivanStudent.Name = "Иван";  //Задаем имя, работает метод set свойства Name
ivanStudent.Grade = 2;      //Задаем курс, работает метод set свойства Grade

//Вывод значений
Console.WriteLine("Имя: " + ivanStudent.Name);      //Получаем имя, работает метод get свойства Name
Console.WriteLine("Курс: " + ivanStudent.Grade);    //Получаем курс, работает метод get свойства Grade

Код представлен с комментариями, который поясняют что и когда работает. А в следующем уроке мы продолжим разговор о свойствах.

Перейти к следующему уроку