С# имеет оператор using
, особенно для объектов IDisposable. Предположительно, любой объект, указанный в операторе using
, будет содержать определенный ресурс, который должен быть освобожден детерминированным образом.
Однако мне кажется, что в программировании есть много проектов, которые имеют одно, определенное начало и конец, но не обладают внутренней поддержкой языка. Конструкция using
предоставляет возможность использовать встроенные функции редактора кода, чтобы, по крайней мере, четко и естественно выделить область такой конструкции или операции.
То, что я имею в виду, - это такая операция, которая часто начинается с метода BeginXXX()
и EndXXX()
, хотя существует множество различных вариантов, таких как выполнение асинхронного кода, которое включает в себя "начало" и "старт", присоединиться".
Возьмите этот наивный пример.
webDataOperation.Start();
GetContentFromHardDrive();
webDataOperation.Join();
// Perform operation that requires data from both sources
Что, если вместо этого метод Start возвратил объект, метод IDisposable.Dispose
выполняет операцию соединения.
using(webDataOperation.Start()) {
GetContentFromHardDrive();
}
// Perform operation that requires data from both sources
Или, еще лучше, что я специально имел в виду: у меня есть объект, который выполняет высокоспециализированную графическую бликировку и имеет метод Begin()
и End()
(дизайн также присутствует в DirectX и XNA). Вместо того, чтобы...
using(blitter.BlitOperation()) {
// Do work
}
// Use result
Это кажется более естественным и читаемым, но нецелесообразно, поскольку он использует интерфейс IDisposable
и оператор using
для непреднамеренных целей? Другими словами, совместимо ли это с перегрузкой оператора неинтуитивным способом?