Как я могу создать такой метод, как блокировка в С#
Т.е. шаблон блокировки
lock(inputParam)
{
// code here
}
Я хочу создать аналогичный метод с похожим шаблоном использования, который внутренне выполняет некоторый код до и после кода между скобками,
SomeFunc(InputParam)
{
// Do some stuff
}
Является ли блокировка специальным случаем в С#, или мы можем добиться аналогичных результатов с помощью какой-то тёмной магии лямбда/действия?
Нет темной магии. Вы хотите try/finally
:
DoSomething();
try
{
// lots of stuff here
}
finally
{
// do other stuff
}
Я полагаю, вы могли бы написать метод, который сделает это за вас:
void DoTryFinally(Action start, Action stuff, Action final)
{
start();
try
{
stuff();
}
finally
{
final();
}
}
И назвать это:
DoTryFinally(
() => { /* start stuff here */ },
() => { /* stuff here */ },
() => { /* final stuff here */ });
Я бы предложил первый способ: try/finally
- обычная идиома на С#.
Кстати, код, который вы отправили:
lock (someObject)
{
// do stuff
}
На самом деле это просто сокращение от того, что по существу это:
Monitor.Enter(someObject);
try
{
// do stuff
}
finally
{
Monitor.Exit(someObject);
}
Компилятор генерирует это, когда компилирует оператор lock
.
В компилятор не встроен механизм, который позволит вам делать это с произвольными функциями. Шаблон Dispose близок, но это не общее решение.
lock
является лишь немного особенным: он упоминается в спецификации С#, но эквивалентен коду, который вы могли бы написать (см. §8.12 спецификации). Вы можете сделать что-то смутное сходство:
void Main()
{
SomeFunc(2, () => {
//do stuff
});
}
public void SomeFunc(int inputParam, Action body)
{
//do before stuff
body();
// do after stuff
}
Однако такой рисунок звучит необычно. Я бы посмотрел, есть ли лучший способ сделать то, что я хочу, прежде чем считать, что это хороший подход.
using()
соответствовать вашим требованиям?