2017-09-10 5 views
1

ではありません。これはおそらく非常に基本的なことですが、私はそれをGoogle検索して検索しましたが、最初のステートメントは結果を生成します。これは、私が他のステートメントを何とかしてしまったことを示しています。それは私を少し夢中にさせている。参考までに、これはフォームウィンドウで初めての経験です。C#if/else最初のステートメントは動作していますが、残りの部分は

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Wk2_Part1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      int season; 
      int job; 
      season = Convert.ToInt32(textBox1.Text); 
      job = Convert.ToInt32(textBox2.Text); 
      if (season == 1) 
       if (job == 1) 
        label3.Text = "There is a 20% discount on the exterior job"; 
      else 
       if (season == 2) 
        if (job == 1) 
         label3.Text = "There is a 20% discount on the exterior job"; 
      else 
       if (season == 3) 
        if (job == 2) 
         label3.Text = "There is a 30% discount on the interior job"; 
      else 
       label3.Text = "No discount, regular prices apply"; 
     } 
    } 
} 
+6

常に中かっこを使用してください。常に。 –

+0

私はあなたのロジックを見て、switch文を使うのが最善の方法だと思います。 –

答えて

3

C#はPythonではありません。 elseifとすると、それはelseとなります。ifです。そのブロックのifをそのブロックの後のelseと接続させたくない場合、ブロックを囲むには中括弧({})が必要です。また、ブロックifの内部条件が満たされない場合でも常にTextプロパティを設定する必要があります。あなたは、コードを繰り返す必要はありませんので、私はまた、あなたのロジックビットを変更します

:もちろん

if ((season == 1 || season == 2) && job == 1) 
    label3.Text = "There is a 20% discount on the exterior job"; 
else if (season == 3 && job == 2) 
    label3.Text = "There is a 30% discount on the interior job"; 
else 
    label3.Text = "No discount, regular prices apply"; 

を、上記I には、私はあなたが必要と言っていても、プットブレースませんでした元のコードにしてください。実際には、私は個人的にを使用することを好むが、上記は元の書式と一貫しています。

(コードで私の他の投稿された回答のいずれかを見ると、流れ制御文の後ろにあるブロックされていないブロックの一例も見つかるでしょう。私が意図的に元の質問のコードと一致させようとしているところで上記のようになります)。

2つの違いは、中括弧がブロックifelseforwhileなどのようなフロー制御文の目的のための単一のステートメントとして扱われるC#ステートメントなどです。元のコードを中括弧で修正するには、requi赤の内側をif (job == 1)の部分の中に入れてください。の中括弧とその外側のelseです。そうすれば、内側のifは、中括弧によって定義されたブロック全体に含まれ、後に続くelseとマッチすることはできません(分岐/ループ文は中括弧で囲まれたコードブロックに及ぶことはできません)。

上記では、内部はありませんifです。 ifの条件がtrueのときに実行される単一のステートメントだけです。したがって、ifの最も近い文と一致する次のelseは正しく動作します。

また、中括弧は、文のブロックが周囲のフロー制御ステートメントとは別になければならない場合は、が必要です。です。もし唯一のものがあれば裸の文があるのはいいですが、それはelseと中括弧なしで間違って一致することになるifではありません。

ただし、厳密には必要でない場合でも、をとすることがあります。他の場合にはを使用することがあります。また、多くの人は、必要でない場合でも、その文で制御したいブロックを定義するために、すべてのフロー制御ステートメントの後でそれらを使用する方が良いと感じています。

これを行う理由は、特に、あなたが遭遇した問題を防ぐためです。どのブロックのコードがどのフロー制御になるかを明示することによって、このような問題を回避できます。これは初心者向けのプログラマーにとってだけではないことに注意してください。経験豊富なプログラマであっても、誤ってあなたが行ったのと同じ方法でバグを作成することができます。これは通常、別の理由で起こります。コードはもともとは括弧のないステートメントを1つ使用していましたが、後で誰かがロジックを追加するためにコードを修正する必要がありました。彼らがこれを行うとき、彼らはコードの構造に気付かず、意図されたフロー制御ロジックを破ることができません。場合によっては、文がフローコントロールの外側に巻き上がることがあります。それ以外の場合はelseが間違ったifと一致するシナリオに似ています。いずれにしても、それは悪いニュースであり、常に中カッコを入れるだけで簡単に回避するのは簡単です。

+3

Peter、中括弧の必要性を指摘していますが、中括弧なしの例を使用することになります。あなたは単一行の構文についても説明したいと思うかもしれませんし、なぜそれがここで働くのです –

+1

大きなアドバイス!私は複数の言語を学ぶ過程にあるので、混乱してしまいます。私はプロセスを理解していますが、自分の注意書きには問題があります。 – Bob

+1

それは働いている!とにかく、中括弧を追加しても大丈夫ですが、誰かが一行の構文を説明できるかもしれません。それは将来の参考になるでしょう! :) – Bob

6

もし私があなたのコードブロックとコンパイラの見方を揃えるなら、これは見た目です。以下のコードでは、ifブロックの明示的な開始と終了の括弧がないため、elseブロックが最も近い以前のifと結合されていることがわかります。 Peterが言ったように、C#の空白はPythonのように重要ではありません。

private void button1_Click(object sender, EventArgs e) 
    { 
     int season; 
     int job; 
     season = Convert.ToInt32(textBox1.Text); 
     job = Convert.ToInt32(textBox2.Text); 
     if (season == 1) 
      if (job == 1) 
       label3.Text = "There is a 20% discount on the exterior job"; 
      else 
       if (season == 2) 
        if (job == 1) 
         label3.Text = "There is a 20% discount on the exterior job"; 
        else 
         if (season == 3) 
          if (job == 2) 
           label3.Text = "There is a 30% discount on the interior job"; 
          else 
           label3.Text = "No discount, regular prices apply"; 
    } 

ここで、いくつかの中括弧を追加して問題を解決できます。

private void button1_Click(object sender, EventArgs e) 
    { 
     int season; 
     int job; 
     season = Convert.ToInt32(textBox1.Text); 
     job = Convert.ToInt32(textBox2.Text); 
     if (season == 1) 
     { 
      if (job == 1) 
      { 
       label3.Text = "There is a 20% discount on the exterior job"; 
      } 
     } 
     else 
     { 
      if (season == 2) 
      { 
       if (job == 1) 
       { 
        label3.Text = "There is a 20% discount on the exterior job"; 
       } 
      } 
     } 
     else 
     { 
      if (season == 3) 
      { 
       if (job == 2) 
       { 
        label3.Text = "There is a 30% discount on the interior job"; 
       } 
      } 
     } 
     else 
     { 
      label3.Text = "No discount, regular prices apply"; 
     } 
    } 

このようなコードの問題は2倍です。 1)それはあまり読みにくくない、2)それはあまりテスト可能ではない。 Peterが指摘したように、if文のいくつかを以下のように組み合わせることによって、このコードの複雑さを簡単に減らすことができます。

if ((season == 1 || season == 2) && job == 1) 
{ 
    label3.Text = "There is a 20% discount on the exterior job"; 
} 
else if (season == 3 && job == 2) 
{ 
    label3.Text = "There is a 30% discount on the interior job"; 
} 
else 
{ 
    label3.Text = "No discount, regular prices apply"; 
} 

これにより、コードがわかりやすくなり、文字列メッセージの重複が少なくなりますが、ここでは中止しません。このコードをテスト可能にするには、ボタンのクリックがあり、おそらくフォームコンポーネント(label3)が含まれているという事実に依存するものを削除する必要があります。そのためには、このコードブロックをという文字列を返すメソッドに移動することができます。

private void button1_Click(object sender, EventArgs e) 
{ 
    int season = Convert.ToInt32(textBox1.Text); 
    int job = Convert.ToInt32(textBox2.Text); 

    label3.Text = GetDiscount(season, job); 
} 

private String GetDiscount(int season, int job) 
{ 
    if ((season == 1 || season == 2) && job == 1) 
    { 
     return "There is a 20% discount on the exterior job"; 
    } 

    if (season == 3 && job == 2) 
    { 
     return "There is a 30% discount on the interior job"; 
    } 

    return "No discount, regular prices apply"; 
} 

このようにして、データの入力と表示に関連するフォームからコードを切り離しました。また、else文の必要性を排除することで、複雑さをさらに軽減しました。メソッドから文字列を返すことで、ifチェックを続行する必要がないため、コードブロックを終了します。

0

これはC#でコードが読み取られる方法です。

if (season == 1) 
    if (job == 1) 
     label3.Text = "There is a 20% discount on the exterior job"; 
    else if (season == 2) 
     if (job == 1) 
      label3.Text = "There is a 20% discount on the exterior job"; 
     else if (season == 3) 
      if (job == 2) 
       label3.Text = "There is a 30% discount on the interior job"; 
      else 
       label3.Text = "No discount, regular prices apply"; 

C#はロジックのインデントを消費しません。だから、括弧を使うほうがいい。

関連する問題