C# 如何创建一个使用模式(如lock)的方法?
如何在C中创建一个像lock这样的方法# 也就是说,锁的样式是C# 如何创建一个使用模式(如lock)的方法?,c#,design-patterns,methods,locking,C#,Design Patterns,Methods,Locking,如何在C中创建一个像lock这样的方法# 也就是说,锁的样式是 lock(inputParam) { // code here } 我想创建一个类似的方法,使用类似的使用模式,在括号之间的代码前后内部执行一些代码 SomeFunc(InputParam) { // Do some stuff } 锁是C#中的一个特例,还是我们能够用某种lambda/动作黑魔法获得类似的结果?lock只是有点特殊:它在C#规范中提到过,但相当于您可以编写的代码(请参见第8.12节)。你可以做一些大
lock(inputParam)
{
// code here
}
我想创建一个类似的方法,使用类似的使用模式,在括号之间的代码前后内部执行一些代码
SomeFunc(InputParam)
{
// Do some stuff
}
锁是C#中的一个特例,还是我们能够用某种lambda/动作黑魔法获得类似的结果?
lock
只是有点特殊:它在C#规范中提到过,但相当于您可以编写的代码(请参见第8.12节)。你可以做一些大致相似的事情:
void Main()
{
SomeFunc(2, () => {
//do stuff
});
}
public void SomeFunc(int inputParam, Action body)
{
//do before stuff
body();
// do after stuff
}
然而,这种模式听起来很不寻常。在假设这是一个好方法之前,我想看看是否有更好的方法来做我想做的事情。
lock
只是有一点特殊:它在C#规范中提到过,但相当于您可以编写的代码(参见的§8.12)。你可以做一些大致相似的事情:
void Main()
{
SomeFunc(2, () => {
//do stuff
});
}
public void SomeFunc(int inputParam, Action body)
{
//do before stuff
body();
// do after stuff
}
然而,这种模式听起来很不寻常。在我认为这是一个好方法之前,我想看看是否有更好的方法来做我想做的事情。没有黑魔法。您需要的是
尝试/最终:
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
语句时生成
编译器中没有内置的工具可以让您使用任意函数实现这一点。这很接近,但它不是一个普遍的解决方案。没有黑魔法。您需要的是尝试/最终:
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
语句时生成
编译器中没有内置的工具可以让您使用任意函数实现这一点。很接近,但它不是一个通用的解决方案。会满足您的要求吗?您是在问如何编写函数吗?你刚才描述的是一个函数…离它不远,但是有一种方法可以满足你的需求?你是在问如何编写函数吗?你刚才描述的是一个函数…离它不远,但是有一个方法让我发疯了“这样的模式听起来不寻常,但是”--OP想要实现的模式实际上是Decorator模式(OP用另一些调用前和调用后的语句装饰一堆语句)。所以从技术上讲,这听起来很平常。基本上,我只需要有一个可重用的模式,这本质上是一个文件查找系统,它使用锁本身,并在大型应用程序中调节(注册/取消注册/和可查询)对文件(文件名)的访问“然而,这样的模式听起来很不寻常”---OP想要实现的模式实际上是Decorator模式(OP用另一些调用前和调用后的语句装饰一组语句)。所以从技术上讲,这听起来很平常。基本上,我只需要有一个可重用的模式,这本质上是一个文件查找系统,它使用锁本身,并在大型应用程序中调节(注册/取消注册/和可查询)对文件(文件名)的访问。您的最后一个示例(模式)是我在应用程序中经常看到的,基本上实现了类似的结果,请参见Tims答案的注释,但是我认为我可以做一些比动作更优雅的事情,但是我认为动作是汉克斯,你的最后一个示例(模式)是我在应用程序中的很多内容,基本上实现了类似的结果,见对Tims答案的评论,然而我认为我可以做一些比动作更优雅的事情,不管我认为动作是什么