В чем разница, когда оператор if имеет {} и когда оператор if не имеет {}?

#c# #if-statement

#c# #if-statement

Вопрос:

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

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

Кто-нибудь может помочь мне объяснить, чтобы я мог понять? Ниже приведен код Xamarin с его кодом C # позади.

 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage Padding="20" xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:local="clr-namespace:T_3000_QuotePageXMAL"
        x:Class="T_3000_QuotePageXMAL.MainPage">

<StackLayout>
    <Button Text="Next" Clicked="Button_Clicked"></Button>
    <Label Text="{Binding Source={x:Reference Slider}, Path=Value, 
     StringFormat='Font Size:{0:N0}'}"></Label>
    <Slider x:Name="Slider" Maximum="50" Minimum="16"></Slider>
    <Label x:Name="currentQuote"
           FontSize="{Binding Source={x:Reference Slider},Path=Value}"> 
    </Label>
</StackLayout>

</ContentPage>
  

Теперь, код C #, лежащий в основе:

  public partial class MainPage : ContentPage
 {
    int index = 0;
    public string[] quotes = new string[]
 {
    "Life is like riding a bicycle. To keep your balance, you must 
     keep moving.",
    "You can't blame gravity for falling in love.",
    "Look deep into nature, and then you will understand everything 
     better."
  } ;
  public MainPage()
  {
    InitializeComponent();
    currentQuote.Text = quotes[index];

  }

  private void Button_Clicked(object sender, EventArgs e)
  {
    index  ;
    if (index>= quotes.Length)
    {  // when I remove the { } from this block the button works 
        index = 0;
        currentQuote.Text = quotes[index];

    } // but when they are inserted , the button does not work
  }
  

}

Смотрите комментарии к блоку кода оператора if.

Комментарии:

1. Эту информацию можно легко найти в документации, learn.microsoft.com/en-us/dotnet/csharp/language-reference / … и для вас действительно лучше, если вы привыкнете искать вещи такого типа, это более эффективно, и вы будете учиться быстрее и больше

2. И все же вопрос достаточно специфичен, чтобы заслуживать ответа. Я сильно сомневаюсь, что это было задано ранее в этой форме..

3. Форматирование документа (Ctrl K, Ctrl D) является недооцененной функцией. Без фигурных скобок переформатируйте документ, и это даст вам лучшее представление о том, что происходит без них.

4. Как эмпирическое правило, вы должны всегда использовать квадратные скобки, если код, который зависит от условия if, не является ровно одним оператором, и даже в этом случае вы все еще можете (некоторые бы даже сказали, должны) использовать квадратные скобки.

Ответ №1:

Если убрать фигурные скобки:

 if (index>= quotes.Length)
  index = 0;
  currentQuote.Text = quotes[index];
  

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

 // only the first statement is part of the if
if (index>= quotes.Length) index = 0;

// this statement executes even if the IF statement fails
currentQuote.Text = quotes[index];
  

В C # фигурные скобки {} определяют блок кода.

Для предотвращения двусмысленности рекомендуется использовать операторы {} in if и else , хотя это вопрос предпочтения или стиля.

Комментарии:

1. то же самое, если я напишу: — if (индекс>= кавычки. Длина) { index = 0; } else { currentQuote. Текст = кавычки [индекс]; } — Я прав?

2. Нет. Блок else выполняется ТОЛЬКО тогда, когда значение IF равно false. В этом примере ВСЕГДА выполняется второй оператор

3. оооо, хорошо … Я понимаю … спасибо, что развеяли мои сомнения