Форматирование/отступы для использования операторов (С#)

Когда дело доходит до операторов using в С# (чтобы не путать с директивами using, которые импортируют пространства имен), Visual Studio не будет указывать однострочный код отступа, если не используются фигурные скобки. Это типично для "вложенности" с использованием утверждений, как показано в этом вопросе SO.

Я сбиваю с толку, что последующие утверждения после using не имеют отступ, в отличие от форматирования оператора if:

// non-indented using statement
using (var myResource = new SomeIDisposableResource())
myResource.Indent(false);

// indented if statement
if (something == true)
    IndentMe();

Есть ли какая-либо причина не для отступов или это просто предпочтение?

// indented using statement, but not the default VS formatting
using (var myResource = new SomeIDisposableResource())
    myResource.Indent();

EDIT:

Дальнейшее тестирование показывает, что я был некорректен относительно некоторых правил форматирования VS. Если вы введете оператор using:

using (var myResource = SomeIDisposableResource())

... и нажмите enter, курсор выровнятся с using. Если следующая строка также является оператором using, она будет продолжать выравниваться. Если это не так, VS будет отступать после завершения. Таким образом, мой первоначальный вопрос несколько недействителен, потому что мой первый пример не является реально достижимым, если вы не отмените форматирование по умолчанию или не используете среду IDE, которая этого не делает.

Тем не менее, стоит знать, что несколько операторов using лучше всего рассматривать как один блок, потому что они технически являются. Отсутствие отступов применяется только тогда, когда операторы являются последовательными операторами using без брекетов; и, как только к нему привыкнуть, они перестают выглядеть так необычно.

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

Ответы

Ответ 1

Как говорили другие, всегда используйте фигурные скобки. Однако есть одна идиома, которая несколько противоречит этому и использует "неизображение":

using (Resource1 res1 = new Resource1())
using (Resource2 res2 = new Resource2())
using (Resource3 res3 = new Resource3())
{
    // Do stuff with res1, res2 and res3
}

Но я всегда использовал скобки для самого внутреннего блока:)

Ответ 2

Это предпочтение. Я всегда отступаю и помещаю необходимые элементы в скобки

using(var t = new t())
{
   t.Foo();
}

Ответ 3

Простое исправление: всегда используйте явные блоки, даже для отдельных строк. Visual Studio будет правильно отступ, и в качестве бонуса ваш код будет более удобным для обслуживания!

Ответ 4

Как мой инструктор C рассказал мне более 10 лет назад: всегда, всегда, всегда используйте фигурные скобки. Скорее всего, кто-то собирается прийти (возможно, даже вы) и бросить другую строку кода, а затем задаться вопросом, почему он не ведет себя правильно.

Ответ 5

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

Вот как я его отформатировал:

using (Resource1 res1 = new Resource1())
using (Resource2 res2 = new Resource2())
using (Resource3 res3 = new Resource3())
  DoStuffWithResources(res1, res2, res3);

Если бы я заменил DoStuffWithResources на несколько операторов, я бы использовал брекеты. Однако мой редактор не позволяет мне делать следующую ошибку:

using (Resource1 res1 = new Resource1())
using (Resource2 res2 = new Resource2())
using (Resource3 res3 = new Resource3())
  DoStuffWithResources(res1, res2, res3);
  DoOtherStuffWithResources(res1, res2, res3);

Когда я пытаюсь ввести выше, я сразу получаю:

using (Resource1 res1 = new Resource1())
using (Resource2 res2 = new Resource2())
using (Resource3 res3 = new Resource3())
  DoStuffWithResources(res1, res2, res3);
DoOtherStuffWithResources(res1, res2, res3);

Pro tip: нисходящая линия не является контраргументом, поэтому, если у вас ее нет, вы не должны голосовать.