Найти в Дзене
Programmer

Основы программирования. Как работают "под капотом" все свойства и индексаторы?

В языке C# не очень давно ввели понятия свойств и индексаторов, которые стали по своей сути прокладками в виде методов геттеров и сеттеров между конечной скрытой переменной и внешним миром. В данной статье разберем подробно механизм данных удобных сущностей, так как скорее всего эти элементы присутствуют в других языках программирования или будут присутствовать позже.

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

Сейчас вам на картинке постараюсь подробно нарисовать механизм работы свойств и индексаторов, чтоб вы лучше всех понимали принцип их работы "под капотом", так как из-за плохого официального объяснения все люди в мире в них путаются, впрочем, это так во всем программировании...

Картинка в цветном формате показывает полную механику работы всех свойств и индексаторов, которые в основном используются в языке C# :

Подробная иллюстрация для статьи по механике работы свойств и индексаторов

Поясню рисунок. Итак, на картинке вы видите на примере свойства работу данного механизма, который у всех индексаторов абсолютно аналогичен, за исключением способа обращения, то есть к свойствам вы обращаетесь по их имени, а к индексаторам обращаетесь по имени их объекта, в котором они находятся, добавляя к имени объекта оператор квадратных скобок с параметрами или индексами. Все остальное "под капотом" полностью одинаково у свойств и индексаторов, поэтому я вам советую навсегда заучить данную картинку, которую я для вас долго подробно рисовал!

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

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

Что вы должны главным образом запомнить из всего вышесказанного?

1. Промежуточная временная константа value создается только внутри метода сеттера копированием извне полученного значения. Она живет до конца метода и обычно в методе ее копируют в конечную переменную свойства. Таким образом, мы получаем промежуточную константу свойства value, которая в сеттере живет во время данного метода-прокладки, а по краям от нее копируемые значения исходного и конечного вида.

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

То есть использование свойств и индексаторов вам всего лишь добавляет промежуточную константу value на время метода сеттера, а в обратном случае мгновенную промежуточную константу на выходе из геттера, во всем остальном операция свойств и индексаторов аналогична обычному присвоению значений переменным и извлечению значений из них. Индексаторы отличаются от свойств только тем, что в них вместо имени свойства нужно написать имя текущего внешнего объекта к индексатору и рядом поставить оператор квадратных скобок с указанием индекса в них. Все остальное - абсолютно такое же, как я описал выше!

Напоследок скажу, что индексаторы очень удобно применять не только в коллекциях, где они поистине неоценимы, а еще индексаторы очень круто применять в виде частей объектов. Как пример, примените индексатор в объекте "Карта Москвы", то есть проиндексируйте части данного объекта квадратными скобками. В итоге у вас, например, Красная площадь будет вызываться индексатором части объекта Moskow [ 5, 8] , а Старый Арбат будет вызываться индексатором Moskow [45, 75] . Хорошая идея? И после этого дураки говорят, что индексаторы можно только в коллекциях использовать...

!!!!Напомню, что компилятор не копирует константные, мгновенные, примитивные объекты и объекты с одной степенью свободы, а это вы должны учитывать, то есть данные промежуточные объекты в индексаторах и свойствах также копироваться не будут, поэтому ресурсы ЭВМ затрачиваться в сравнении с обычными переменными также не будут. Но об этой сложной теме я планирую сделать отдельную большую статью.

Итак, сегодня в данной статье я постарался максимально подробно для вас объяснить "подкапотный" механизм работы свойств и индексаторов, так вам точно в мире никто этого не пояснит. Специально я решил разобрать все до микроэлементов, чтоб вы не мучались никогда, а спокойно их всегда применяли и знали, сколько они затрачивают ресурсов. Теперь вы знаете все о свойствах и индексаторах.

Подписывайтесь, комментируйте, ставьте лайки...

Наука
7 млн интересуются