Хотелось бы, чтобы у нас был шаблон "Usable" в C #, когда блок кода с использованием конструкции передавался бы функции в качестве делегата:
class Usable : IUsable
{
public void Use(Action action) // implements IUsable
{
// acquire resources
action();
// release resources
}
}
и в коде пользователя:
using (new Usable())
{
// this code block is converted to delegate and passed to Use method above
}
Плюсы:
- Контролируемое выполнение, исключения
- Факт использования "Usable" виден в стеке вызовов
Минусы:
Как вы думаете, это выполнимо и полезно, и если у него нет проблем с языковой точки зрения? Есть ли какие-либо подводные камни, которые вы можете увидеть?
РЕДАКТИРОВАТЬ: Дэвид Шмитт предложил следующие
using(new Usable(delegate() {
// actions here
}) {}
Он может работать в этом примере, но обычно у вас уже есть выделенный ресурс, и вы хотите, чтобы он выглядел следующим образом:
using (Repository.GlobalResource)
{
// actions here
}
Где GlobalResource (да, я знаю, что глобальные ресурсы плохие) реализует IUsable.
Вы можете переписать так коротко, как
Repository.GlobalResource.Use(() =>
{
// actions here
});
Но это выглядит немного странно (и более странно, если вы реализуете интерфейс явно), и это так часто встречается в различных вариантах, что я подумал, что он заслуживает того, чтобы быть новым синтаксическим сахаром в языке.