Ответ 1
Да, вы также можете поместить их в один оператор:
using (MemoryStream data1 = new MemoryStream(),
data2 = new MemoryStream())
{
// do stuff
}
Сегодня я просматривал код С# сотрудников и нашел следующее:
using (MemoryStream data1 = new MemoryStream())
using (MemoryStream data2 = new MemoryStream())
{
// Lots of code..........
}
Я всегда видел инструкцию using
, а затем пару фигурных скобок, которые определяли сферу жизни объекта. Мой коллега, написавший код, сказал, что фигурные скобки для оператора data1
using
не нужны, а код сделал то же самое, что и они присутствовали и вложили в инструкцию data2
using
. Итак, что происходит, когда фигурные скобки опущены?
Да, вы также можете поместить их в один оператор:
using (MemoryStream data1 = new MemoryStream(),
data2 = new MemoryStream())
{
// do stuff
}
Те же правила применяются, если вы опускаете фигурные скобки в инструкции for
или if
.
Кстати, если вы задумываетесь над скомпилированным кодом, декомпилятор компилятор добавляет фигурные скобки.
Именно то, что он сказал. Вышеупомянутый код точно такой же, как и запись:
using (MemoryStream data1 = new MemoryStream())
{
using (MemoryStream data2 = new MemoryStream())
{
// Lots of code
}
}
Вы можете опустить фигурные скобки после команды if/else/for/while/using/etc, если в инструкции есть только одна команда. Примеры:
// Equivalent!
if (x==6)
str = "x is 6";
if(x == 6) {
str = "x is 6";
}
// Equivalent!
for (int x = 0; x < 10; ++x) z.doStuff();
for (int x = 0; x < 10; ++x) {
z.doStuff();
}
// NOT Equivalent! (The first one ONLY wraps the p = "bob";!)
if (x == 5)
p = "bob";
z.doStuff();
if (x == 5) {
p = "bob";
z.doStuff();
}
Это жизнеспособно, но рискованно, потому что, если кто-то позже решит, что они хотят что-то сделать с данными1, прежде чем что-то случится с ним, они могут поместить его сразу после использования data1, который выведет его из всей области данных2, используя, Это, скорее всего, нарушит компиляцию, но все же будет рискованным и бессмысленным ярлыком синтаксиса.
Именно то, что сказал ваш коллега, это эквивалент вложения утверждений. Упорядочить для data2
вызывается непосредственно перед функцией удаления для data1
.
Если есть только одна инструкция, которая следует за инструкцией, скобки не нужны. Это похоже на инструкцию if
.
if(true)
{
Console.Writeline("hello")
}
означает то же самое, что
if(true)
Console.Writeline("hello")
Как говорили люди: если после утверждения есть только одна строка, она будет работать без скрученных скобок. Тем не менее, люди не показывают в своих примерах, что эта строка может быть if/using/for с ее собственными скрученными фигурными скобками. Вот пример:
if(foo)
if(bar)
{
doStuff();
}