Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# 如何在VS2012中获取多个锁而不破坏缩进_C#_Visual Studio_Visual Studio 2012_Auto Indent - Fatal编程技术网

C# 如何在VS2012中获取多个锁而不破坏缩进

C# 如何在VS2012中获取多个锁而不破坏缩进,c#,visual-studio,visual-studio-2012,auto-indent,C#,Visual Studio,Visual Studio 2012,Auto Indent,这看起来是个愚蠢的问题,但我找不到解决办法 我的问题是C#不允许在一个lock语句中获取多个锁。这行不通: lock (a, b, c, d) { // ... } 相反,要做到这一点,似乎需要大量的缩进: lock (a) lock (b) lock (c) lock (d) { // ... } 再加上代码已经存在的所有其他缩进级别(名称空间、类、方法、

这看起来是个愚蠢的问题,但我找不到解决办法

我的问题是C#不允许在一个
lock
语句中获取多个锁。这行不通:

lock (a, b, c, d)
{
    // ...
}
相反,要做到这一点,似乎需要大量的缩进:

lock (a)
    lock (b)
        lock (c)
            lock (d)
            {
                // ...
            }
再加上代码已经存在的所有其他缩进级别(名称空间、类、方法、条件、循环等等),这就太疯狂了。因此,我想使用以下格式:

lock (a) lock (b) lock (c) lock (d)
{
    // ...
}
lock (a)
lock (b)
lock (c)
lock (d)
{
}
保持我的理智。但是VisualStudio(我使用的是2012)不会听说它。只要我输入任何右括号,上面的内容就会变成一些愚蠢的东西,比如:

lock (a) lock (b) lock (c) lock (d)
                  {
                      // ...
                  }

看来我无能为力。有什么办法可以让它工作吗?

一次使用那么多锁只会导致死锁。见鬼,即使一次获得两个不同的锁也会有这种风险

至少,您应该非常非常小心,在每次获取多个锁的情况下,只能以完全相同的顺序获取这些锁

此外,“好的格式”也在旁观者的眼中。也就是说,每个人对什么是最好的都有自己的想法。但是,除非您明确要求(例如,通过触发自动格式规则或显式自动格式),否则以下操作应该可以正常工作,而不会干扰它:

您还可以将这种方法用于
使用
语句(通常一行中有多个语句),而VS IDE已经预料到了这一点。

只是一个想法:-)

以及使用方法

LockAndExecute.Do(new[]{a, b}, () => {
    Console.WriteLine("Eww!");
});

您可以通过更改代码来解决IDE的恼人行为,尽管更改代码以解决IDE行为的想法让我有点良心不安。如果这是一个玩具项目,我会这么做,但不会做其他开发者可能会做的任何严肃的事情

使用
IDisposable
实现来实现锁定。
using
语句没有
lock
语句那样令人讨厌的缩进问题

class myLock : IDisposable
{
    private object _obj;

    public myLock(object obj)
    {
        _obj = obj;
        System.Threading.Monitor.Enter(obj);
    }

    public void Dispose()
    {
        System.Threading.Monitor.Exit(_obj);
        _obj = null;
    }

    public static void example()
    {
        var obj1 = new object();
        var obj2 = new object();
        var obj3 = new object();

        lock (obj1)
            lock (obj2)
                lock (obj3)
                {
                    // Stupid indentation >:(
                }

        using (new myLock(obj1))
        using (new myLock(obj2))
        using (new myLock(obj3))
        {
            // Ahhhh... :-)
        }
    }
}

您是否安装了Resharper或类似软件?@DaveZych不,我不使用任何第三方模块。希望您不要经常这样做。获取多个锁可能是使自己陷入死锁状态的最简单方法。这并不是对你问题的回答。。因此有一个评论。。一开始你为什么要用这么多锁。。你要么有非常复杂和罕见的情况。。或者这是一个危险信号。你可以关闭自动格式化…几乎可以工作,但不完全可以:最后一个锁会自动缩进。
class myLock : IDisposable
{
    private object _obj;

    public myLock(object obj)
    {
        _obj = obj;
        System.Threading.Monitor.Enter(obj);
    }

    public void Dispose()
    {
        System.Threading.Monitor.Exit(_obj);
        _obj = null;
    }

    public static void example()
    {
        var obj1 = new object();
        var obj2 = new object();
        var obj3 = new object();

        lock (obj1)
            lock (obj2)
                lock (obj3)
                {
                    // Stupid indentation >:(
                }

        using (new myLock(obj1))
        using (new myLock(obj2))
        using (new myLock(obj3))
        {
            // Ahhhh... :-)
        }
    }
}