我如何创建一个使用模式像锁的方法
本文关键字:模式 方法 何创建 创建 一个 | 更新日期: 2023-09-27 18:08:39
如何在c#中创建一个类似lock的方法
。锁的模式是
lock(inputParam)
{
// code here
}
我想创建一个类似的方法,使用类似的使用模式,在内部执行括号之间的代码前后的代码,
SomeFunc(InputParam)
{
// Do some stuff
}
是锁在c#中的特殊情况,或者我们能够实现类似的结果与某种lambda/action黑魔法?
禁止使用黑魔法。你想要的是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模式很接近,但它不是通用的解决方案。
lock
只是有一点特殊:它在c#规范中提到,但等同于你可以编写的代码(参见规范的§8.12)。你可以做一些类似的事情:
void Main()
{
SomeFunc(2, () => {
//do stuff
});
}
public void SomeFunc(int inputParam, Action body)
{
//do before stuff
body();
// do after stuff
}
然而,这样的模式听起来很不寻常。在假设这是一个好方法之前,我会看看是否有更好的方法来做我想做的事情。