c# - 如何在VS2012中获取多个锁而不弄乱缩进

标签 c# visual-studio visual-studio-2012 auto-indent

这看起来是一个愚蠢的问题,但我找不到解决方案。

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

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

相反,它似乎需要大量的缩进才能做到这一点:

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

再加上代码已经存在的所有其他缩进级别(命名空间、类、方法、条件、循环……),这会变得疯狂。因此,我想使用这种格式:

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

并保持我的理智。但 Visual Studio(我使用的是 2012)不会听说它。一旦我输入任何右大括号,上面的内容就会变成一些愚蠢的东西,例如:

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

看来我无能为力。有什么办法可以做到这一点吗?

最佳答案

只是一个想法:- )

static class LockAndExecute
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    static void _gen(Action a, object[] objs, int i = 0){

        bool lockWasTaken = false;
        var temp = objs[i];
        try { 
            Monitor.Enter(temp, ref lockWasTaken); 
            if(i + 1 >= objs.Length) 
                a();
            else
                _gen(a, objs, i + 1);
        }
        finally 
        { 
            if (lockWasTaken) 
                Monitor.Exit(temp); 
        }
    }

    public static void Do(object[] objectsToLock, Action action){
            _gen(action, objectsToLock);
    }
}

以及用法;

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

关于c# - 如何在VS2012中获取多个锁而不弄乱缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896253/

相关文章:

C# File.Replace 防止崩溃

c# - 有没有办法让 SetUpFixture 每个类运行一次而不是每个命名空间运行一次?

visual-studio - 光标位于当前行之间时如何插入新行?

visual-studio - 使用 Visual Studio 2022 部署具有多个虚拟应用程序的 Azure 应用服务

visual-studio - 在 Visual Studio 中更改或添加默认编辑器

c# - 如何计算asp.net gridview itemtemplate文本框中的javascript中两个日期之间的天数

c# - 关于 "Possible Multiple Enumeration"可枚举的 *所有* 使用的 Resharper 警告

c# - 如何更改应用程序的初始屏幕位置?

visual-studio - 解决 "LINK : fatal error LNK1561: the entry point must be defined"

angularjs - 在 Azure 服务器 Hot Towel Angular 上获取元数据查询失败错误 Breeze/Breeze/元数据