Что такое RAII? Примеры?

Что такое RAII? Примеры?
Что такое RAII? Примеры? - vphatfla @ Unsplash

Всегда, когда используется термин RAII, люди на самом деле говорят о деконструкции, а не об инициализации. Я думаю, что у меня есть базовое понимание того, что это может означать, но я не совсем уверен. Также: является ли C++ единственным языком RAII? Как насчет Java или C#/.NET?

Приобретение ресурсов — это инициализация означает, что объекты должны заботиться о себе как о полном пакете и не ожидать, что другой код скажет экземпляру: «Эй, кстати, вас скоро уберут — пожалуйста, приберитесь сейчас». Обычно это означает, что в деструкторе есть что-то значимое. Это также означает, что вы пишете класс специально для управления ресурсами, зная, что при определенных труднопредсказуемых обстоятельствах, например при возникновении исключений, вы можете рассчитывать на выполнение деструкторов.

Допустим, вы хотите написать некоторый код, в котором вы собираетесь изменить курсор Windows на курсор ожидания (песочные часы, пончик неработающего и т. д.), сделать свое дело, а затем изменить его обратно. И скажите также, что «делай свое дело» может вызвать исключение. Способ RAII сделать это состоял бы в том, чтобы создать класс, ctor которого установил курсор в режим ожидания, чей единственный «настоящий» метод делал все, что вы хотели, и чей dtor устанавливал курсор обратно. Ресурсы (в данном случае состояние курсора) привязаны к области действия объекта. Когда вы получаете ресурс, вы инициализируете объект. Вы можете рассчитывать на то, что объект будет уничтожен, если возникнут исключения, а это значит, что вы можете рассчитывать на очистку ресурса.

Правильное использование RAII означает, что вам не нужно finally. Конечно, он основан на детерминированном разрушении, которого нет в Java. Вы можете получить своего рода детерминированное разрушение в C# и VB.NET с помощью using.


LetsCodeIt, 30 мая 2023 г., 01:35