Помимо использования yield
для итераторов в Ruby, я также использую его для кратковременного возврата элемента управления к вызывающему, прежде чем возобновить управление в вызываемом методе. То, что я хочу делать на С#, похоже. В тестовом классе я хочу получить экземпляр соединения, создать другой экземпляр переменной, который использует это соединение, а затем передать переменную вызывающему методу, чтобы его можно было воспроизвести. Затем я хочу, чтобы управление возвращалось к вызываемому методу, чтобы соединение могло быть удалено. Наверное, мне нужен блок/закрытие, как в Ruby. Здесь общая идея:
private static MyThing getThing()
{
using (var connection = new Connection())
{
yield return new MyThing(connection);
}
}
[TestMethod]
public void MyTest1()
{
// call getThing(), use yielded MyThing, control returns to getThing()
// for disposal
}
[TestMethod]
public void MyTest2()
{
// call getThing(), use yielded MyThing, control returns to getThing()
// for disposal
}
...
Это не работает в С#; ReSharper сообщает мне, что тело getThing
не может быть блоком итератора, потому что MyThing
не является типом интерфейса итератора. Это определенно верно, но я не хочу перебирать некоторые списки. Я предполагаю, что я не должен использовать yield
, если я не работаю с итераторами. Любая идея, как я могу достичь этой операции блокировки/закрытия в С#, поэтому мне не нужно переносить код в MyTest1
, MyTest2
,... с кодом в getThing()
body?