Вы не можете определить подобные конструкции напрямую, но есть способы создать похожие лаконичные шаблоны:
Вы можете определить классы, которые реализуют IDisposable для инкапсуляции такого рода семантики использования блоков.Например, если у вас был какой-то класс, который инкапсулировал получение блокировки чтения ReaderWriterLockSlim (приобретение при конструировании, выпуск при утилизации), вы можете создать свойство в своем классе, которое создает экземпляр, что приводит к синтаксису, подобному следующему:
using (this.ReadLock) // This constructs a new ReadLockHelper class, which acquires read lock
{
//Do stuff here....
}
//After the using, the lock has been released.
Возможно, это злоупотребление IDisposable, но этот шаблон определенно использовался в производственном коде.
Вы можете использовать Аспектно-ориентированное программирование (с такими инструментами, как PostSharp ) дляоберните тело метода с помощью многократно используемой логики входа / выхода.Это часто используется для добавления в журнал или других сквозных задач, которые вы хотели бы применить к своему коду, не загромождая его.
Вы можете написать функции, которые принимают делегатов в качестве параметров, которые затем заключают делегированный делегатлогика в некоторой подобной структуре.Например, для ReaderWriterLockSlim снова вы можете создать метод, подобный следующему:
private void InReadLock(Action action)
{
//Acquires the lock and executes action within the lock context
}
Это может быть довольно мощным, поскольку поддержка лямбда-выражения с замыканиями допускает сколь угодно сложную логику без создания функций-оболочек вручную иПередача обязательных параметров в полях.