2014-09-23 5 views
3

иногда я вижу код вроде следующего фактически не зная значения этого:Блок кода без синтаксического значения

void myFunc() { 
    MyClass a = new MyClass(); 

    { 
     if (a.b == null) // doSomething 
    } 
} 

Мне очень нравится этот вид кода сортировки и капсулирования (не только потому, что вы можете свернуть весь блок сразу, если вы не прочитаете его содержимое), но мне интересно, имеет ли он какое-либо синтаксическое значение, дополняющее только оптический отступ. Ofc. Я знаю, что, как и в каждом блоке кода, любая переменная, объявленная в блоке, доступна только там, но есть и больше. Существуют также инициализаторы объектов, но поскольку те, которые касаются фактического экземпляра класса, выше, являются полностью независимым блоком.

+4

Насколько я знаю, единственным синтаксическим значением «свободного» блока являются переменные области видимости. – Jodrell

+0

на самом деле не видели этого ... интересного, хотя ... – Noctis

+0

Вне того, что вы упоминаете о сфере видимости - не должно быть другого смысла. –

ответ

0

Строит, как тот, который вы описали

void myFunc() { 
    MyClass a = new MyClass(); 

    { 
     if (a.b == null) // doSomething 
    } 
} 

в основном используются для одной и той же вещи, почему вы любите их. Только для оптических причин и возможности свернуть эти части. Они также могут использоваться для изменения переменных областей, но это менее редко используется, чем для других целей.

Возможной альтернативой этому (учитывая только оптические причины) было бы использование регионов для достижения того же результата. Хотя у него есть тот недостаток, что вам приходится писать больше, чем просто {}, у вас есть преимущество в том, что вы можете объявить WHAT частью кода.

void myFunc() { 
    MyClass a = new MyClass(); 

    #region Setting the players base stats 
     if (a.b == null) // doSomething 
    #endregion 
} 

Этот подход не делает ничего для видимости переменной, но дает, по крайней мере некоторое представление о том, что она является то, что в настоящее время не показан (если область свернут). Также оба метода могут быть объединены (таким образом, {} внутри области, чтобы вы могли инкапсулировать переменные).

void myFunc() { 
    MyClass a = new MyClass(); 

    #region Setting the players base stats 
    { 
     if (a.b == null) // doSomething 
    } 
    #endregion 
} 

Но вернемся к вашему вопросу, помимо оптических причин и вариабельных областей нет синтаксических причин, чтобы сделать это.

3

Интересно, если это имеет какое-либо значение синтаксического дополнительное для всего оптического отступа

Нет, нет ничего особенного в них. Язык C# объявляет блок как пару фигурных скобок, инкапсулируя необязательный список операторов, и отмечает, что это разрешает несколько операторов, которые должны быть записаны в местах, где разрешен один оператор.

Это, в свою очередь, упрощает другие части спецификации языка, такие как if, for и т. Д., Которые затем могут быть просто указаны так, как если бы за ними следовали только один оператор.

Тот факт, что это означает, что вы также можете использовать их в другом месте, в основном является счастливой случайностью.

Вы можете прочитать полную спецификацию для них в разделе 8.2 C# language spec

+0

Полезно знать, как 'if' и все остальные части работают за кулисами – HimBromBeere

Смежные вопросы