2014-11-12 1 views
1

Это выглядит глупым вопросом, но я не могу найти решение этого.Как приобрести несколько замков в VS2012 без помех отступа

Моя проблема заключается в том, что 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) 
        { 
         // ... 
        } 

И кажется, что нет ничего, что я могу сделать. Есть ли способ сделать эту работу?

+0

У вас есть Resharper или аналогичный установленный? –

+0

@DaveZych Нет, я не использую сторонние модули. –

+2

Можно было бы надеяться, что вы не часто это делаете. Приобретение нескольких замков - это, вероятно, самый простой способ попасть в тупик. –

ответ

1

Используя это, многие замки одновременно запрашивают тупик. Черт, даже приобретая два разных замка за один раз, это риск.

По крайней мере, вы должны быть очень очень осторожны, только когда-либо делайте эти блокировки точно в том же порядке везде, где одновременно приобретается более одного.

Кроме того, «хорошее форматирование» находится в глазу наблюдателя. То есть, у каждого есть своя идея о том, что лучше. Но, должно работать, без VS возиться с ним, если вы специально не попросите его (например, путем запуска правила автоматического форматирования или явно автоматическое форматирование):

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

Вы также можете использовать этот подход с using отчетности (где гораздо чаще встречается более одного подряд), где VS IDE уже его ожидает.

+0

Почти работает, но не совсем: последний замок автоматически отступается. –

2

Просто идея: -)

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!"); 
}); 
Смежные вопросы