Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建一个使用模式(如lock)的方法?_C#_Design Patterns_Methods_Locking - Fatal编程技术网

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节)。你可以做一些大

如何在C中创建一个像lock这样的方法#

也就是说,锁的样式是

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答案的评论,然而我认为我可以做一些比动作更优雅的事情,不管我认为动作是什么