Как мне создать метод с шаблоном использования, таким как блокировка?

1

Как я могу создать такой метод, как блокировка в С#

Т.е. шаблон блокировки

lock(inputParam)
{
   // code here
}

Я хочу создать аналогичный метод с похожим шаблоном использования, который внутренне выполняет некоторый код до и после кода между скобками,

SomeFunc(InputParam)
{
   // Do some stuff
}

Является ли блокировка специальным случаем в С#, или мы можем добиться аналогичных результатов с помощью какой-то тёмной магии лямбда/действия?

  • 0
    Будет ли using() соответствовать вашим требованиям?
  • 0
    Вы спрашиваете, как написать функцию? То, что вы только что описали, является функцией ... msdn.microsoft.com/en-us/library/ms173114.aspx
Показать ещё 1 комментарий
Теги:
methods
design-patterns
locking

2 ответа

3
Лучший ответ

Нет темной магии. Вы хотите 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 близок, но это не общее решение.

  • 0
    Спасибо, ваш последний пример (шаблон) - это то, что у меня есть много вокруг моего приложения, и, по сути, достижение аналогичных результатов, см. Комментарий к ответу Тимса, однако я подумал, что есть кое-что, что я мог бы сделать немного более элегантным, чем просто действия, однако я думаю действия это
1

lock является лишь немного особенным: он упоминается в спецификации С#, но эквивалентен коду, который вы могли бы написать (см. §8.12 спецификации). Вы можете сделать что-то смутное сходство:

void Main()
{
    SomeFunc(2, () => {
        //do stuff
    });
}
public void SomeFunc(int inputParam, Action body)
{
    //do before stuff
    body();
    // do after stuff
}

Однако такой рисунок звучит необычно. Я бы посмотрел, есть ли лучший способ сделать то, что я хочу, прежде чем считать, что это хороший подход.

  • 0
    «Такой шаблон звучит необычно, однако» - шаблон, который OP хочет реализовать, на самом деле является шаблоном Decorator (OP декорирует кучу операторов с помощью некоторых других операторов до и после вызова). Технически это звучит довольно обычно.
  • 0
    По сути, мне просто нужно иметь шаблон многократного использования, то есть, по сути, файловую систему, которая использует саму блокировку и регулирует (регистрирует / отменяет регистрацию / запрашивает) доступ к файлам (fileNames) в большом приложении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню