c# - 如何创建一个使用模式如锁的方法?

标签 c# design-patterns methods locking

我如何在 C# 中创建类似 lock 的方法

即锁的模式是

lock(inputParam)
{
   // code here
}

我想创建一个具有类似使用模式的类似方法,在内部执行括号之间代码前后的一些代码,

SomeFunc(InputParam)
{
   // Do some stuff
}

lock 是 C# 中的特例,还是我们可以使用某种 lambda/action dark magic 获得类似的结果?

最佳答案

没有黑魔法。你想要的是 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 是 C# 中的常见习惯用法。

顺便说一下,您发布的代码:

lock (someObject)
{
    // do stuff
}

实际上只是本质上的简写:

Monitor.Enter(someObject);
try
{
    // do stuff
}
finally
{
    Monitor.Exit(someObject);
}

编译器在编译 lock 语句时生成它。

编译器中没有内置工具可让您使用任意函数执行此操作。 Dispose pattern接近,但这不是一个通用的解决方案。

关于c# - 如何创建一个使用模式如锁的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24216378/

相关文章:

C# 在 SQL 中编辑行

c# - String、FormattableString、IFormattable 之间的区别

C#,从引用的项目访问类

c# - 将 lambda 表达式作为参数传递,然后使用参数执行该 lambda

Java 删除方法返回新数组,删除出现的整数(到数组列表)

c# - Microsoft Visual Studio C# 2010 Express : Can debug but not build

c# - 我可以使用 cancellationToken == CancellationToken.None 来检查 default(CancellationToken)

c# - 装饰器模式,通过继承还是依赖注入(inject)?

javascript - 强制子类不可变

python - 有没有办法使用 String replace() 方法来替换任何东西