@ChechenProgrammer

Поля и Свойства/get/set — что это? Как понять? Можно ли объяснить как то по проще/человечески?

https://www.youtube.com/watch?v=CSbix3v6AUY&list=P... Прохожу курс и тут напрочь застрял. Какой-то Гет Сет, аццессор и т.д не понимаю что и для чего и почему? Может немного по проще объяснить можно, на простеньком примере? Ведь тот кто понимает сможет без проблем привести простенький пример?
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
WNeZRoS
@WNeZRoS
Как я понимаю, поля и методы вам уже понятны.

Например, есть у вас код который выводит в консоль площадь квадрата:
void Calculate()
{
    var quad = new Quad();
    quad.Size = 10;
    Console.WriteLine(quad.Area);
}

А сам класс квадрата определён так:
class Quad
{
    public float Size;
    public float Area;
}

Как видно, площадь (Area) никто не вычисляет и выводится всегда будет 0, т.е. код не работает.
Чтобы его починить нужно что-бы кто-то эту площадь.

(1) Самый тупой вариант, посчитать её в Calculate
void Calculate()
{
    var quad = new Quad();
    quad.Size = 10;
    quad.Area = quad.Size * quad.Size;
    Console.WriteLine(quad.Area);
}

В этом варианте нам надо править код, который использует этот класс Quad. Если этого кода много, то это куча лишней работы. И в целом, класс Quad теряет смысл, все его переменные можно в методах объявить, это будет намного оптимальнее.
(2) Вариант чуть лучше - сделать метод расчёта площади в Quad
class Quad
{
    public float Size;
    public float Area;

    public void UpdateArea()
    {
        Area = Size * Size;
    }
}

Нам всё-равно нужно менять код использующий этот класс Quad, и добавлять вызов UpdateArea после изменения размера. Тоже не очень-то удобно.


Если Area надо всегда считать, то может лучше сделать метод?
class Quad
{
    public float Size;

    public float GetArea()
    {
        return Size * Size;
    }
}

Теперь не нужно вызывать ничего лишнего, но нам придётся пройтись по всем старым использования поля Area и заменить их на вызов нового метода GetArea.

Но можно сделать метод GetArea похожим на поле Area и не придётся менять код его использующий. Для этого и применяются Свойства.
class Quad
{
    public float Size;

    public float Area
    {
        get { return Size * Size; }
    }
}

При использовании класса Quad теперь Area выглядит как поле, но его нельзя менять т.к. у него нет set части.

Можно пойти другим путём, и пересчитывать поля Area при изменении размера:
class Quad
{
    private float size;

    public float Size
    {
        get { return size; }
        set
        {
            size = value;
            Area = size * size;
        }
    }

    public float Area;
}

В таком варианте у нас Area считается при изменении Size, а не при доступе к Area. Какой вариант лучше - зависит от задачи и её требований.

Если подытожить, то Свойства это методы похожие по использованию на поля.
аццессор = accessor = средство доступа - обобщённое название для get и set
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы