В C # есть оператор 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
для непреднамеренных целей? Другими словами, будет ли это наравне с o загрузкой оператора неинтуитивным способом?