2014-01-11 3 views
1

Это очень простой вопрос, но я бы хотел знать, прежде чем двигаться вперед, чтобы понять процесс.Что делать {} делать в C#

В следующем учебном пособии я использовал инструкцию if. Если вы сделаете этот код вам не нужно использовать {}

if (userValue == "1") 
    message = "You won a new car!"; 

Но если вы используете более одной строки кода, вам нужно {}.

if (userValue == "1") 
{ 
    WriteLine ("You won a new car!"); 
    ReadLine(); 
} 

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

+0

Использование брекетов даже для отдельных линий предотвращает случайную ошибку. Этот вопрос задан уже много раз ... http://stackoverflow.com/questions/12193170/whats-the-purpose-of-using-for-a-singleline Линия Muppet upvote ahoy! –

+1

http://msdn.microsoft.com/en-us/library/fh88ctk1.aspx – OldProgrammer

+0

@OldProgrammer - несмотря на ссылку на C spec, это прекрасно, поскольку C/C++/Java/JavaScript/C# имеют по существу одно и то же правило для ' если-statement'. –

ответ

3

{} указывает блок кода. Если у вас есть несколько операторов, которые вы хотите выполнить, если , если истинно, вам необходимо использовать их.

Пример: Без {} этого блока:

if (userValue == "1") 
    WriteLine ("You won a new car!"); 
    ReadLine(); 

будет выполнять ReadLine() команду или нет userValue равно 1.

Контраст, что с одной с помощью фигурных скобок :

if (userValue == "1") 
{ 
    WriteLine ("You won a new car!"); 
    ReadLine(); 
} 

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

1

{} определяет область действия выражения. В C# и еще на нескольких других языках они позволили сократить, что для простых выражений, как ваш первый пример.

1

{} определяет область выполнения в C языках, таких как C++, C#, Java. Если вы добавите {} в оператор if, вы определите, что будет выполняться внутри этого условия.

//1.both lines are surrounded by { } 
if (userValue == "1") 
{ 
    //executes both lines when value is 1 
    WriteLine ("You won a new car!"); 
    ReadLine(); 
} 

//2.No { } after the if statement 
if (userValue == "1") 
    //executes only this one when value is 1 - it's scope is implied (see point 3.below) 
    WriteLine ("You won a new car!"); 
//this one always will get executed, as it is not in scope of the if statement 
ReadLine(); 

//3 - no {} means implied scope for one liner 
if (userValue == "1") 
    message = "You won a new car!"; 

//and is equivalent to 
if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 
7

Они известны как blocks.

Блок разрешает выполнение нескольких операторов в контекстах, где разрешен один оператор.

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

Блоки также имеют свои собственные scope, что означает, что переменная, определенная внутри блока, не может быть указана вне блока, а две переменные в отдельных блоках различны, даже если они имеют одинаковое имя.

Большинство языков программирования имеют какие-либо блоки, и тот факт, что C# использует фигурные скобки для их разграничения, помещает его в семейство синтаксически связанных языков, известных как curly-brace languages, а также C, C++, Java и многие другие.

5

В вашем примере {} задает блок кода. Вы можете легко написать первый как

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 

Иногда вы можете опустить {}, когда блок содержит только один заявление.

if (userValue == "1") 
    message = "You won a new car!"; 

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

if (userValue == "1") 
    message = "You won a new car!"; 
    ReadLine(); 

Это эквивалентно

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 
ReadLine(); 

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

+0

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

+0

@MitchWheat Я обновил свой ответ с этим. – MarcinJuraszek

1

Ваш первый пример - способ предоставить ярлык на C#. Компилятор обрабатывает

if (userValue == "1") 
    message = "You won a new car!"; 

и

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 

как точно так же.

С личным предпочтением следует использовать ли стенографию для однострочных линий;

Типичным примером является быстрый возврат из функции:

if (isValid = false) 
    return false; 

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

if (userValue == "1") 
    message = "You won a new car!"; 
else 
    message = "You won a hippopotamus!" 

Это плохая форма (по моему скромному мнению), хотя она будет компилироваться.

Важно то, каким образом вы решили написать свои однострочные линии, согласуйтесь с тем или иным способом во всем коде.

1

Там нет никакой разницы между:

if (userValue == "1") 
    message = "You won a new car!"; 

и

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 

... кроме стиля. Но:

if (userValue == "1") 
    message = "You won a new car!"; 
    GiveNewCar(); 

Теперь вы наличные деньги, потому что все это получить новый автомобиль. Без блока видимости только оператор, следующий за условием if, будет привязан к/protected с помощью оператора if. Строк ниже не будет. Чтобы этого не случилось, вам необходимо:

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
    GiveNewCar(); 
} 

Теперь только те, кто заслужил немногих, получат его.

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

1

Представьте себе, если бы у вас была

if (userValue == "1") 
    WriteLine ("You won a new car!"); 
    ReadLine(); 

В C# (и в большинстве языков) отступы не делает никакой разницы (так называемый 'пробельные')

Что касается C# касается то будет то же самое, как

if (userValue == "1") 
    WriteLine ("You won a new car!"); 
ReadLine(); 

Это не то, что вы намеревались! Следовательно, вам нужно {}. Одиночная линия работает потому, что компилятор может увидеть запятую на конце

If you are interested in languages where {} are not used and indentation is used 
    look at python 
0

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

SA1503: CurlyBracketsMustNotBeOmitted: http://stylecop.soyuz5.com/SA1503.html

4

Но если вы используете более одной строки кода, вам нужно {}.

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

if (...) 
    try { 
    Method(); 
    } catch { 
    ... 
    } 

В этом примере элемента следующей за if линии имеет много линий, но не требует скобок. Это связано с тем, что сама конструкция try представляет собой одно утверждение. Когда есть несколько операторов, которые необходимо выполнить как часть if, вы можете использовать {}, чтобы сгруппировать их. Несмотря на то, что {} может содержать несколько операторов, сама конструкция {} считается единственным выражением.

Есть два примечательных исключения из этого правила: метки и декларации. Оба являются операторами, но ни один из них не может использоваться непосредственно после оператора if (...).

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