2013-10-30T00:21:29の更新内容

programming/vb.net/statement_select_case/index.wiki.txt

current previous
4,75 4,38
 

        

        
 
-関連するページ
-関連するページ
 
--[[programming/vb.net/statement_if_then_else]]
--[[programming/vb.net/statement_if_then_else]]
+
--[[programming/vb.net/block_scope]]
 

        

        
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
~
*Select Caseステートメントの構文と例
*Select Caseステートメント
~
Select Caseステートメントは、ある値を分類し、その分類に応じて実行する処理を分岐させるための構文です。 構文の形式は次の通りです。 ``[ ]``でくくった部分は省略することが可能な箇所です。
Select Caseステートメントは、ある値に対してその分類を行い、その分類毎に実行するプログラムを変えるための構文です。 構文の形式は次の通りです。
+

          
+
#code(vb,Select Caseステートメントの構文){{
+
Select [ Case ] 分類する値を保持する変数
 

        

        
-
#code(vb){{
-
Select [ Case ] 分類する元の値を保持する変数
 
   [ Case 値 [, 値 [, 値 ... ] ]
   [ Case 値 [, 値 [, 値 ... ] ]
 
      [ ステートメント ] ]
      [ ステートメント ] ]
+

          
 
   [ Case Else
   [ Case Else
 
      [ ステートメント ] ]
      [ ステートメント ] ]
+

          
 
End Select
End Select
 
}}
}}
 

        

        
~
Select Caseステートメントを使った具体例を挙げると次のようになります。
Case Elseの部分は、どの分類にも当てはまらなかった場合に実行されます。 次のコードは、1から10までの数値について、(奇数ではなく)素数か偶数かに分類するものです。 Forステートメントについては[[programming/vb.net/basics/03_statement_02_loop#ForStatement]]を参照してください。
 

        

        
 
#code(vb){{
#code(vb){{
+
Dim i As Integer = 3
+

          
+
' 変数iの値によって処理を分岐する
+
Select Case i
+

          
+
  Case 1
+
    ' iが1の場合
+
    Console.WriteLine("i は 1です")
+

          
+
  Case 2, 3
+
    ' iが2または3の場合
+
    Console.WriteLine("i は 2 または 3 です")
+

          
+
  Case 4
+
    ' iが4の場合
+
    Console.WriteLine("i は 4 です")
+

          
+
  Case Else
+
    ' それ以外の場合
+
    Console.WriteLine("i はそれ以外の値です")
+

          
+
End Select
+
}}
+

          
+
Select Caseステートメント内で記述される``Case &var{値};``のうち、いずれかに一致するものがあればそのCase以下のステートメントが実行されます。 ``Case``で分類する値はカンマ``,``で区切ることにより複数記述することができます。 この場合、どれか1つでも一致する値があれば、そのCase以下のステートメントが実行されます。 ``Case Else``の部分は、値がどの分類にも当てはまらなかった場合に実行されます。
+

          
+
*フォールスルー
+
Select Caseステートメントでは、どこか一箇所でも一致する分類があった場合は、それ以降は''他の分類と一致するかどうかの評価はされません''。 つまり、VB.NETのCaseでは、Cなどのcaseラベルとは異なり''フォールスルーしません''。 複数のCaseで同じ値を記述することはできますが、実行されるステートメントは最初に一致する値が見つかった箇所だけとなります。
+

          
+
具体例を挙げると次のようになります。 次のコードは、1から10までの数値について、(奇数ではなく)素数か偶数かに分類するものです。
+

          
+
#code(vb){{
+
' 1から10までの値をSelect Caseで分類する
 
For i As Integer = 1 To 10
For i As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case 2, 3, 5, 7
        Case 2, 3, 5, 7
~
      Console.WriteLine("{0} は素数です。", i)
            Console.WriteLine("{0} は素数です。", i)
 

        

        
~
    Case 2, 4, 6, 8, 10
        Case 2, 4, 6, 8, 10
~
      Console.WriteLine("{0} は偶数です。", i)
            Console.WriteLine("{0} は偶数です。", i)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} は偶数でも素数でもありません。", i)
            Console.WriteLine("{0} は偶数でも素数でもありません。", i)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}
90,75 53,71
 
10 は偶数です。
10 は偶数です。
 
}}
}}
 

        

        
~
この実行結果から分かるとおり、偶数でも素数でもある2はただ単に「素数である」とだけ表示され、「偶数である」とは表示されません。
この実行結果から分かるとおり、偶数でも素数でもある2はただ単に素数であるとだけ表示され、偶数であるとは表示されていません。 これは、Select Caseステートメントでは最初に一致する分類があった以降は他の分類と一致するか評価されないためです。 つまり、VB.NETのCaseでは、Cなどのcaseラベルとは異なり''フォールスルーしません''。
 

        

        
~
*Caseの省略
Select Caseステートメントは、Caseを省略して単にSelectと記述することもできます。 従って、次の二つのSelectステートメントはどちらも同等のものとなります。
+
Select Caseステートメントは、Caseを省略して単に``Select``と記述することもできます。 従って、次の二つのSelectステートメントはどちらも同等のものとなります。
 

        

        
 
#code(vb){{
#code(vb){{
 
' Caseを省略しない例
' Caseを省略しない例
 
Select Case i
Select Case i
 

        

        
~
  Case 2, 4, 6, 8, 10
    Case 2, 4, 6, 8, 10
~
    Console.WriteLine("{0} は偶数です。", i)
        Console.WriteLine("{0} は偶数です。", i)
 

        

        
~
  Case Else
    Case Else
~
    Console.WriteLine("{0} は偶数ではありません。", i)
        Console.WriteLine("{0} は偶数ではありません。", i)
 

        

        
 
End Select
End Select
 

        

        
 
' Caseを省略した例
' Caseを省略した例
 
Select i
Select i
 

        

        
~
  Case 2, 4, 6, 8, 10
    Case 2, 4, 6, 8, 10
~
    Console.WriteLine("{0} は偶数です。", i)
        Console.WriteLine("{0} は偶数です。", i)
 

        

        
~
  Case Else
    Case Else
~
    Console.WriteLine("{0} は偶数ではありません。", i)
        Console.WriteLine("{0} は偶数ではありません。", i)
 

        

        
 
End Select
End Select
 
}}
}}
 

        

        
~

          
また、Select Caseステートメントは文字列を元にした分類にも使うことが出来ます。
+
*文字列の分類
+
Select Caseステートメントでは数値だけでなく文字列の分類にも使うことができます。
 

        

        
 
#code(vb){{
#code(vb){{
~
Dim s As String = "Alice"
Dim s As String = "ABC"
 

        

        
 
Select s
Select s
 

        

        
~
  Case "Alice", "Eve"
    Case "あいう", "えお"
~
    Console.WriteLine("女性名")
        Console.WriteLine("ひらがな")
 

        

        
~
  Case "Bob", "Charlie", "Dave"
    Case "abc", "ABC"
~
    Console.WriteLine("男性名")
        Console.WriteLine("アルファベット")
 

        

        
~
  Case Else
    Case Else
~
    Console.WriteLine("未分類・その他")
        Console.WriteLine("その他")
 

        

        
 
End Select
End Select
 
}}
}}
 

        

        
~

          
**Case句と条件式
~
*Case句と条件式
Case句では分類したい値をカンマで区切る他にも条件式を記述することができます。 値が''ある範囲にあるかどうか''で分類したい場合は To を使うことができます。 例えば&var{X};以上&var{Y};以下の範囲の値を分類したい場合は &var{X}; To &var{Y}; と記述します。
+
Case句では分類したい値をカンマで区切る他にも条件式を記述することができます。 値が''ある範囲にあるかどうか''で分類したい場合は``To``を使うことができます。 例えば&var{X};以上&var{Y};以下の範囲の値を分類したい場合は``&var{X}; To &var{Y};``と記述します。
 

        

        
 
#code(vb,Toで値を分類する例){{
#code(vb,Toで値を分類する例){{
 
For i  As Integer = 1 To 10
For i  As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case 2 To 5
        Case 2 To 5
~
      Console.WriteLine("{0} は2〜5の値です。", i)
            Console.WriteLine("{0} は2〜5の値です。", i)
 

        

        
~
    Case 6 To 9
        Case 6 To 9
~
      Console.WriteLine("{0} は6〜9の値です。", i)
            Console.WriteLine("{0} は6〜9の値です。", i)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} は分類されなかった値です。", i)
            Console.WriteLine("{0} は分類されなかった値です。", i)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}
176,26 135,26
 
10 は分類されなかった値です。
10 は分類されなかった値です。
 
}}
}}
 

        

        
~
[[比較演算子>programming/vb.net/operator_comparison]]を使って値を分類したい場合は、``To``の代わりに``Is``を使うことができます。 例えば&var{X};未満の値を分類したい場合は``Is < &var{X};``と記述します。 同様に、&var{X};以外の値を分類したい場合は``Is <> &var{X};``と記述します。 分類条件はCase句が記述されている順(上から順)に評価されるため、複雑な条件を記述する場合は注意が必要です。
[[比較演算子>programming/vb.net/operator_comparison]]を使って値を分類したい場合は、To の代わりに Is を使うことができます。 例えば&var{X};未満の値を分類したい場合は Is < &var{X}; と記述します。 同様に、&var{X};以外の値を分類したい場合は Is <> &var{X};と記述します。 分類条件はCase句が記述されている順(上から順)に評価されるため、複雑な条件を記述する場合は注意が必要です。
 

        

        
 
#code(vb,Is + 比較演算子で値を分類する例){{
#code(vb,Is + 比較演算子で値を分類する例){{
 
For i  As Integer = 1 To 10
For i  As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case Is < 5
        Case Is < 5
~
      Console.WriteLine("{0} は5未満の値です。", i)
            Console.WriteLine("{0} は5未満の値です。", i)
 

        

        
~
    Case Is >= 8
        Case Is >= 8
~
      Console.WriteLine("{0} は8以上の値です。", i)
            Console.WriteLine("{0} は8以上の値です。", i)
 

        

        
~
    Case Is <> 6
        Case Is <> 6
~
      Console.WriteLine("{0} は5以上8未満、かつ6以外の値です。", i)
            Console.WriteLine("{0} は5以上8未満、かつ6以外の値です。", i)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} は分類されなかった値です。", i)
            Console.WriteLine("{0} は分類されなかった値です。", i)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}
213,9 172,9
 
10 は8以上の値です。
10 は8以上の値です。
 
}}
}}
 

        

        
~
``To``や``Is``を使った条件式も、カンマで区切ることにより1つのCase句で複数個記述することができます。 ただし、カンマで区切った場合は条件式は左から順に評価され、かつショートサーキットによる評価が行われる点に注意が必要です。 つまり、1つのCase句に複数個の条件式が記述されていて、なおかつその途中に一致する条件式があった場合は、それ以降の条件式は評価されません。
To や Is を使った条件式も、カンマで区切ることにより1つのCase句で複数個記述することができます。 ただし、カンマで区切った場合は条件式は左から順に評価され、かつショートサーキットによる評価が行われる点に注意が必要です。 つまり、1つのCase句に複数個の条件式が記述されていて、なおかつその途中に一致する条件式があった場合は、それ以降の条件式は評価されません。
 

        

        
~
さらに、``To``や``Is``では範囲に具体的な数値を指定する代わりに、変数や定数を指定することもできます。
さらに、To や Is では範囲に具体的な数値を指定する代わりに、変数や定数を指定することもできます。
 

        

        
 
#code(vb,ToおよびIsの条件式に変数の値を使う例){{
#code(vb,ToおよびIsの条件式に変数の値を使う例){{
 
Dim min As Integer = 3
Dim min As Integer = 3
223,15 182,15
 

        

        
 
For i  As Integer = 1 To 10
For i  As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case min To max
        Case min To max
~
      Console.WriteLine("{0} は {1} から {2} 以内の値です。", i, min, max)
            Console.WriteLine("{0} は {1} から {2} 以内の値です。", i, min, max)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} は {1} から {2} 以外の値です。", i, min, max)
            Console.WriteLine("{0} は {1} から {2} 以外の値です。", i, min, max)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 

        

        
239,18 198,18
 

        

        
 
For i  As Integer = 1 To 10
For i  As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case Is <= min
        Case Is <= min
~
      Console.WriteLine("{0} は {1} 以下の値です。", i, min)
            Console.WriteLine("{0} は {1} 以下の値です。", i, min)
 

        

        
~
    Case Is >= max
        Case Is >= max
~
      Console.WriteLine("{0} は {1} 以上の値です。", i, max)
            Console.WriteLine("{0} は {1} 以上の値です。", i, max)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} は {1} より大きく {2} より小さい値です。", i, min, max)
            Console.WriteLine("{0} は {1} より大きく {2} より小さい値です。", i, min, max)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}
279,29 238,29
 
10 は 7 以上の値です。
10 は 7 以上の値です。
 
}}
}}
 

        

        
~
Case句でメソッドを呼び出し、その戻り値をもとに分類することもできます。 以下の例はCase句でメソッドを呼び出す例ですが、このようなSelect Caseステートメントの使用法は読みやすさ・分かりやすさの観点から言えば推奨できるものではありません。 あくまでこういった使用法もできるという1つの例であり、このような場合はSelect Caseではなく[[If Else>programming/vb.net/statement_if_then_else]]を使用すべきです。
Case句でメソッドを呼び出し、その戻り値をもとに分類することもできます。 以下の例はCase句でメソッドを呼び出す例ですが、このようなSelect Caseステートメントの使用法は読みやすさ・分かりやすさの観点から言えば推奨できるものではありません。 あくまでこういった使用法もできるという1つの例であり、このような場合はSelect CaseではなくIf Elseを使用すべきです。
 

        

        
 
#code(vb){{
#code(vb){{
 
Dim str As String = "ABC,123.あいう、123日本語。"
Dim str As String = "ABC,123.あいう、123日本語。"
 

        

        
 
For Each ch As Char In str
For Each ch As Char In str
 

        

        
~
  ' 戻り値がTrueになるようなメソッドを分類する
    ' 戻り値がTrueになるようなメソッドを分類する
~
  Select Case True
    Select Case True
 

        

        
~
    Case Char.IsLetter(ch)
        Case Char.IsLetter(ch)
~
      Console.WriteLine("{0} は文字です", ch)
            Console.WriteLine("{0} は文字です", ch)
 

        

        
~
    Case Char.IsDigit(ch)
        Case Char.IsDigit(ch)
~
      Console.WriteLine("{0} は数字です", ch)
            Console.WriteLine("{0} は数字です", ch)
 

        

        
~
    Case Char.IsPunctuation(ch)
        Case Char.IsPunctuation(ch)
~
      Console.WriteLine("{0} は区切り文字です", ch)
            Console.WriteLine("{0} は区切り文字です", ch)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} はそれ以外の文字", ch)
            Console.WriteLine("{0} はそれ以外の文字", ch)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}
328,24 287,23
 
。 は区切り文字です
。 は区切り文字です
 
}}
}}
 

        

        
~

          
**Exit Selectステートメント
+
*Exit Selectステートメント
 
Case句による分類後に処理を中断してSelectステートメントから脱出するには、Exit Selectステートメントを使います。
Case句による分類後に処理を中断してSelectステートメントから脱出するには、Exit Selectステートメントを使います。
 

        

        
 
#code(vb,Selectステートメントから脱出する例){{
#code(vb,Selectステートメントから脱出する例){{
 
For i As Integer = 1 To 10
For i As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case 1 To 7
        Case 1 To 7
~
      If i Mod 2 = 0 Then Exit Select
            If i Mod 2 = 0 Then Exit Select
 

        

        
~
      Console.WriteLine("{0} は1〜7の範囲にある奇数の数値です。", i)
            Console.WriteLine("{0} は1〜7の範囲にある奇数の数値です。", i)
 

        

        
~
    Case Else
        Case Else
~
      Console.WriteLine("{0} はそれ以外の数値です。", i)
            Console.WriteLine("{0} はそれ以外の数値です。", i)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}
360,25 318,24
 
10 はそれ以外の数値です。
10 はそれ以外の数値です。
 
}}
}}
 

        

        
~

          
**他のCase句へのジャンプ
+
*他のCase句へのジャンプ
 
C#のswitch文ではgoto caseやgoto defaultを使うことで他のラベル(Case句)へジャンプすることができますが、VBではそれに相当する構文は用意されていません。 代わりに通常のGoToステートメントを使用し、他のCase句に設定したラベルへとジャンプさせます。
C#のswitch文ではgoto caseやgoto defaultを使うことで他のラベル(Case句)へジャンプすることができますが、VBではそれに相当する構文は用意されていません。 代わりに通常のGoToステートメントを使用し、他のCase句に設定したラベルへとジャンプさせます。
 

        

        
 
#code(vb){{
#code(vb){{
 
For i As Integer = 1 To 10
For i As Integer = 1 To 10
 

        

        
~
  Select Case i
    Select Case i
 

        

        
~
    Case 1 To 7
        Case 1 To 7
~
      If i Mod 2 = 0 Then GoTo OtherNumber
            If i Mod 2 = 0 Then GoTo OtherNumber
 

        

        
~
      Console.WriteLine("{0} は1〜7の範囲にある奇数の数値です。", i)
            Console.WriteLine("{0} は1〜7の範囲にある奇数の数値です。", i)
 

        

        
~
    Case Else
        Case Else
 
OtherNumber:
OtherNumber:
~
      Console.WriteLine("{0} はそれ以外の数値です。", i)
            Console.WriteLine("{0} はそれ以外の数値です。", i)
 

        

        
~
  End Select
    End Select
 

        

        
 
Next
Next
 
}}
}}

programming/vb.net/statement_if_then_else/index.wiki.txt

current previous
4,107 4,75
 

        

        
 
-関連するページ
-関連するページ
 
--[[programming/vb.net/statement_select_case]]
--[[programming/vb.net/statement_select_case]]
+
--[[programming/vb.net/block_scope]]
 

        

        
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
 
*Ifステートメント
*Ifステートメント
-
Ifステートメントはある条件が成り立っているか判断してプログラムの流れを変えるために使用する構文です。 構文の形式は次の通りです。
 

        

        
~
**Ifステートメントの構文
-条件が成り立っているときに実行するステートメントが0行以上の時の構文
~
Ifステートメントは条件式で記述された条件が成り立っているかどうかを判断し、実行する処理を分岐させるための構文です。 Ifステートメントの構文の形式は次の通りです。 ``[ ]``でくくった部分は省略することが可能な箇所です。
#code(vb){{
+

          
+
#code(vb,条件が成り立っているときに実行するステートメントが0行以上の時の構文){{
 
If 条件式 Then
If 条件式 Then
~

          
	[ステートメント]
+
  [条件式が成り立っているときに実行するステートメント]
+

          
 
End If
End If
 
}}
}}
~

          
-条件が成り立っているときに実行するステートメントが1行の時の構文
~
#code(vb,条件に応じて実行するステートメントが0行以上の時の構文){{
#code(vb){{
-
If 条件式 Then ステートメント
-
}}
-
-条件に応じて実行するステートメントが0行以上の時の構文
-
#code(vb){{
 
If 条件式 Then
If 条件式 Then
~

          
	[条件式が成り立っている時に実行するステートメント]
+
  [条件式が成り立っている時に実行するステートメント]
+

          
 
Else
Else
~

          
	[条件式が成り立っていない時に実行するステートメント]
+
  [条件式が成り立っていない時に実行するステートメント]
+

          
 
End If
End If
 
}}
}}
~

          
-条件に応じて実行するステートメントが1行の時の構文
~
#code(vb,条件とそれに応じて実行するステートメントが2組以上ある時の構文){{
#code(vb){{
-
If 条件式 Then 条件式が成り立っている時に実行するステートメント [Else 条件式が成り立っていない時に実行するステートメント]
-
}}
-
-条件とそれに応じて実行するステートメントが2組以上ある時の構文
-
#code(vb){{
 
If 条件式1 Then
If 条件式1 Then
~

          
	[条件式1が成り立っている時に実行するステートメント]
+
  [条件式1が成り立っている時に実行するステートメント]
+

          
 
ElseIf 条件式2 Then
ElseIf 条件式2 Then
~

          
	[条件式2が成り立っている時に実行するステートメント]
~
  [条件式2が成り立っている時に実行するステートメント]
 :
~

          
 :
~
ElseIf 条件式3 Then
[Else]
~

          
	[どの条件式にも当てはまらない時に実行するステートメント]
+
  [条件式3が成り立っている時に実行するステートメント]
+
    :
+
    :
+
[Else
+

          
+
  どの条件式にも当てはまらない時に実行するステートメント]
+

          
 
End If
End If
 
}}
}}
 

        

        
~
このように``If ... Then``と``End If``の間の部分に条件式が成り立っている場合に実行するステートメントを記述します。 ``ElseIf ... Then``は最初の``If``、またはひとつ前の``ElseIf``の条件式が成り立っていない場合に判定する条件文および実行するステートメントを記述するためのものです。 ``Else``は他のどの条件文も成り立っていない場合に実行するステートメントを記述するためのものです。
この構文のうち ''[ ]''でくくった部分は省略可能な部分です。
+

          
+
``If ... Then``および``If ... Then ... Else``は、次のように条件式と実行するステートメントを1行で記述することもできます。 この場合、``End If``は不要です。
+

          
+
#code(vb,条件が成り立っているときに実行するステートメントが1行の時の構文){{
+
If 条件式 Then [条件式が成り立っているときに実行するステートメント]
+
}}
+

          
+
#code(vb,条件に応じて実行するステートメントが1行の時の構文){{
+
If 条件式 Then 条件式が成り立っている時に実行するステートメント [Else 条件式が成り立っていない時に実行するステートメント]
+
}}
+

          
+

          
+
**Ifステートメントの例
+
以下の例はIfステートメントを使って、変数に格納されている値によって実行する処理を変える例です。
 

        

        
 
#code(vb,Ifステートメントの例){{
#code(vb,Ifステートメントの例){{
 
Dim i As Integer = 3
Dim i As Integer = 3
 

        

        
+
' 1行形式のIfステートメントの例
 
If i = 3 Then Console.WriteLine("i は 3 です。")
If i = 3 Then Console.WriteLine("i は 3 です。")
 

        

        
+
' 条件式が成り立っている場合とそうでない場合のそれぞれで実行する処理を分ける例
 
If i = 5 Then
If i = 5 Then
 

        

        
~
  ' 条件式が成り立っている(iが5の場合)に実行する処理
    Console.WriteLine("i は 5 です。")
+
  Console.WriteLine("i は 5 です。")
 

        

        
 
Else
Else
 

        

        
~
  ' 条件式が成り立っていない(iが5ではない場合)に実行する処理
    Console.WriteLine("i は 5 ではありません。")
+
  Console.WriteLine("i は 5 ではありません。")
 

        

        
 
End If
End If
 

        

        
+
' 複数の条件と対応する処理を分ける例
 
If i = 5 Then
If i = 5 Then
 

        

        
~
  ' Ifの条件式(i = 5)が成り立っている場合に実行する処理
    Console.WriteLine("i は 5 です。")
+
  Console.WriteLine("i は 5 です。")
 

        

        
+
' 最初のIfの条件式が成り立っていない場合に判定する条件式
 
ElseIf i = 2 Then
ElseIf i = 2 Then
 

        

        
~
  ' ElseIfの条件式(i = 2)が成り立っている場合に実行する処理
    Console.WriteLine("i は 2 です。")
+
  Console.WriteLine("i は 2 です。")
 

        

        
 
Else
Else
 

        

        
~
  ' どの条件式も成り立っていない場合に実行する処理
    Console.WriteLine("i は 5 でも 2 でもありません。")
+
  Console.WriteLine("i は 5 でも 2 でもありません。")
 

        

        
 
End If
End If
 
}}
}}
115,62 83,53
 
i は 5 でも 2 でもありません。
i は 5 でも 2 でもありません。
 
}}
}}
 

        

        
-
また、Ifステートメントの中でさらにIfステートメントを使用することもできます。
 

        

        
~
**条件式と演算子
#code(vb,入れ子にしたIfステートメントの例){{
~
条件式で数値の比較を行うには、``=``, ``<>``, ``<=``などの[[比較演算子>programming/vb.net/operator_comparison]]を使います。
Dim i As Integer = 3
 

        

        
~
#code(vb){{
If i <> 5 Then
+
Dim i As Integer = 2
 

        

        
~
If i = 3 Then Console.WriteLine("i は 3 です。")
    Console.WriteLine("i は 5 ではありません。")
+
If i < 5 Then Console.WriteLine("i は 5未満 です。")
+
If i <> 9 Then Console.WriteLine("i は 9 ではありません。")
+
}}
 

        

        
~
文字列の比較にも``=``や``<>``などの演算子が使える他、[[Stringクラスの検索・比較メソッド>programming/netfx/string/2_1_comparison]]を使うこともできます。
    If i <= 2 Then
 

        

        
~
#code(vb){{
        Console.WriteLine("i は 2 以下です。")
+
Dim s As String = "あいうえお"
 

        

        
~
If s = "abc" Then Console.WriteLine("s は 'abc' です。")
    Else
+
If s.StartsWith("ABC") Then Console.WriteLine("s は 'ABC' で始まる文字列です。")
+
If s.Contains("あ") Then Console.WriteLine("s には 'あ' が含まれています。")
+
}}
 

        

        
~
オブジェクト同士やヌル参照の比較を行う場合には[[IsやTypeOfなど>programming/vb.net/operator_is_isnot_typeof]]を使って条件式を記述します。
        Console.WriteLine("i は 2 より大きいです。")
 

        

        
~
#code(vb){{
    End If
+
Dim s As String = "ABC"
 

        

        
~
If s Is Nothing Then Console.WriteLine("s はヌル参照です。")
End If
+
If TypeOf s Is String Then Console.WriteLine("s は文字列型です。")
+
If TypeOf s Is String() Then Console.WriteLine("s は文字列型の配列です。")
 
}}
}}
 

        

        
~
各演算子やメソッドの詳細については各ページを参照してください。
#prompt(実行結果){{
-
i は 5 ではありません。
-
i は 2 より大きいです。
-
}}
 

        

        
~

          
複数の条件式を結合するにはAndAlso演算子およびOrElse演算子を用います。 条件「&var{X};かつ&var{Y};」は「&var{X}; AndAlso &var{Y};」、「&var{X};または&var{Y};」は「&var{X}; OrElse &var{Y};」と記述します。 また、条件の否定にはNot演算子を用います。 条件「&var{X};ではない」は「Not &var{X};」と記述します。
+
**条件式の結合
+
条件式を結合するには``AndAlso``演算子および``OrElse``演算子を用います。 条件「&var{X};''かつ''&var{Y};」は``&var{X}; AndAlso &var{Y};``、「&var{X};''または''&var{Y};」は``&var{X}; OrElse &var{Y};``と記述します。 また、条件の否定には``Not``演算子を用います。 条件「&var{X};''ではない''」は``Not &var{X};``と記述します。
 

        

        
 
#code(vb,条件式の結合・否定の例){{
#code(vb,条件式の結合・否定の例){{
 
Dim i As Integer = 3
Dim i As Integer = 3
 

        

        
 
If 2 <= i AndAlso i < 5 Then
If 2 <= i AndAlso i < 5 Then
 

        

        
~
  Console.WriteLine("i は 2以上 かつ 5未満の数値です。")
    Console.WriteLine("i は 2以上 かつ 5未満の数値です。")
 

        

        
 
End If
End If
 

        

        
 
If i < 5 OrElse 10 <= i Then
If i < 5 OrElse 10 <= i Then
 

        

        
~
  Console.WriteLine("i は 5未満 または 10以上の数値です。")
    Console.WriteLine("i は 5未満 または 10以上の数値です。")
 

        

        
 
End If
End If
 

        

        
~
If Not i = 5 Then ' i <> 5 と同じ
If Not i = 5 Then
 

        

        
~
  Console.WriteLine("i は 5 以外の数値です。")
    Console.WriteLine("i は 5 以外の数値です。")
 

        

        
 
End If
End If
 
}}
}}
181,117 140,9
 
i は 5 以外の数値です。
i は 5 以外の数値です。
 
}}
}}
 

        

        
~
なお、AndAlso演算子・OrElse演算子は''ショートサーキット''による評価を行います。 その他、論理演算子の詳細については[[programming/vb.net/operator_logical]]を参照してください。
なお、AndAlso演算子・OrElse演算子はショートサーキットによる評価を行います。 その他、論理演算子の詳細については[[programming/vb.net/operator_logical]]を参照してください。
+

          
+

          
+
**複数の条件式
+
IfステートメントではElseIfにより条件式を複数記述することができます。
+

          
+
#code(vb,Ifステートメントと複数の条件式による場合分け){{
+
Dim i As Integer = 3
+

          
+
If i = 1 Then
+

          
+
  ' iが1の場合
+

          
+
ElseIf i = 2 OrElse i = 3 Then
+

          
+
  ' iが2または3の場合
+

          
+
ElseIf i = 4 Then
+

          
+
  ' iが4の場合
+

          
+
Else
+

          
+
  ' それ以外の場合
+

          
+
End If
+
}}
+

          
+
一方、上記の例のように多数の条件で場合分けをする場合は[[Selectステートメント>programming/vb.net/statement_select_case]]を使うこともできます。
+

          
+
#code(vb,Selectステートメントを使った場合分け){{
+
Dim i As Integer = 3
+

          
+
Select i
+
  Case 1
+

          
+
    ' iが1の場合
+

          
+
  Case 2, 3
+

          
+
    ' iが2または3の場合
+

          
+
  Case 4
+

          
+
    ' iが4の場合
+

          
+
  Case Else
+

          
+
    ' それ以外の場合
+

          
+
End Select
+
}}
+

          
+
Selectステートメントについては[[programming/vb.net/statement_select_case]]を参照してください。
+

          
+

          
+
**入れ子
+
Ifステートメントの中にIfステートメントを記述する、つまりIfステートメントを入れ子にすることにより、ある条件が成り立っている場合にさらに追加の条件で分岐を行うようにすることもできます。
+

          
+
#code(vb,入れ子にしたIfステートメントの例){{
+
Dim i As Integer = 3
+

          
+
' 最初の条件式
+
If i <> 5 Then
+

          
+
  Console.WriteLine("i は 5 ではありません。")
+

          
+
  ' 入れ子にしたIfステートメントで、さらに条件分岐を行う
+
  If i <= 2 Then
+

          
+
    Console.WriteLine("i は 2 以下です。")
+

          
+
  Else
+

          
+
    Console.WriteLine("i は 2 より大きいです。")
+

          
+
  End If
+

          
+
End If
+
}}
+

          
+
#prompt(実行結果){{
+
i は 5 ではありません。
+
i は 2 より大きいです。
+
}}
+

          
+
入れ子のIfステートメントは複数の条件をAND結合したものと同じなので、AndAlso演算子を使って1つのIfステートメントで記述することができます。 例えば、次の二つのIfステートメントはどちらも同じ動作となります。
+

          
+
#code(vb,入れ子にしたIfステートメントとAndAlso演算子を使ったIfステートメントの比較){{
+
Dim i As Integer = 3
+

          
+
' 入れ子にしたIfステートメント
+
If 2 <= i Then
+

          
+
  If i < 5 Then
+

          
+
    Console.WriteLine("i は 2以上 かつ 5未満の数値です。")
+

          
+
  End If
+

          
+
End If
+

          
+
' 先のIfステートメントと同じ動作をする条件式のIfステートメント
+
If 2 <= i AndAlso i < 5 Then
+

          
+
    Console.WriteLine("i は 2以上 かつ 5未満の数値です。")
+

          
+
End If
+
}}
 

        

        
~
*If演算子
**If演算子
 
VB.NET 2008(Visual Studio 2008)からはCやC#の三項演算子``~?~:~``と同様の機能を持つIf演算子がサポートされるようになりました。 この演算子を使うことにより、条件分岐と値の代入を1行で行うことができるようになります。
VB.NET 2008(Visual Studio 2008)からはCやC#の三項演算子``~?~:~``と同様の機能を持つIf演算子がサポートされるようになりました。 この演算子を使うことにより、条件分岐と値の代入を1行で行うことができるようになります。
 

        

        
 
#code(vb,IfステートメントとIf演算子の例){{
#code(vb,IfステートメントとIf演算子の例){{
325,7 176,7
 

        

        
 
If演算子について詳しくは[[programming/vb.net/operator_logical#IfOperator]]で解説しています。
If演算子について詳しくは[[programming/vb.net/operator_logical#IfOperator]]で解説しています。
 

        

        
~
*#Ifディレクティブ
**#Ifディレクティブ
 
VB.NETには条件付きのコンパイルを行うための#Ifディレクティブというものがあります。 Ifステートメントと似ていますが、機能はまったく異なります。 Ifステートメントは実行時の条件分岐を行うためのものですが、#Ifディレクティブはコンパイル時の条件分岐を行うためのものです。 次の例は、#Ifディレクティブを使った例です。
VB.NETには条件付きのコンパイルを行うための#Ifディレクティブというものがあります。 Ifステートメントと似ていますが、機能はまったく異なります。 Ifステートメントは実行時の条件分岐を行うためのものですが、#Ifディレクティブはコンパイル時の条件分岐を行うためのものです。 次の例は、#Ifディレクティブを使った例です。
 

        

        
 
#code(vb,#Ifディレクティブの例){{
#code(vb,#Ifディレクティブの例){{

programming/vb.net/block_scope/index.wiki.txt

current previous
1,8 1,6
 
${smdncms:title,ブロックと変数のスコープ}
${smdncms:title,ブロックと変数のスコープ}
 
${smdncms:keywords,変数,ローカル,ブロック,有効範囲}
${smdncms:keywords,変数,ローカル,ブロック,有効範囲}
 

        

        
+
VB.NETではブロックレベルでローカル変数を宣言することができます。 ''ブロック''で宣言されたローカル変数はそのブロック内でのみ有効で、ブロックの外や他のブロックからは参照することができません。 宣言された変数が有効である範囲のことを''スコープ''と呼びます。
+

          
 
-関連するページ
-関連するページ
 
--[[programming/vb.net/local_variable_declaration]]
--[[programming/vb.net/local_variable_declaration]]
 
--[[programming/vb.net/basics/03_statement_02_loop]]
--[[programming/vb.net/basics/03_statement_02_loop]]
12,115 10,48
 

        

        
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
~
*ブロック
*ブロック変数と変数のスコープ
~
[[Ifステートメント>programming/vb.net/statement_if_then_else]]や[[Selectステートメント>programming/vb.net/statement_select_case]]、[[For, For Each, Whileなどの繰り返しのステートメント>programming/vb.net/basics/03_statement_02_loop]]、Try Catchステートメントなどはローカル変数の有効範囲となる''ブロック''を構成します。
VB.NETではブロックレベルで変数を宣言することができます。 ブロックで宣言された変数は、そのブロックでのみ有効で、ブロックの外から参照することはできません。 宣言された変数が有効である範囲のことをスコープと呼びます。
 

        

        
~
例えば、次のコードで宣言されている二つのローカル変数``y``はそれぞれのブロック内でのみ有効で、また互いに独立しています。
次のコードで宣言されている二つのyは全く独立です。
 

        

        
 
#code(vb){{
#code(vb){{
~
Sub Main()
Dim x As Integer
~
  Dim x As Integer ' プロシージャ内のローカル変数

          
-
For x = 1 To 10
 

        

        
~
  For x = 1 To 10
    Dim y As Integer
+
    Dim y As Integer ' ブロック内のローカル変数
 

        

        
 
    y = x - 10
    y = x - 10
+
  Next
 

        

        
~
  ' この部分は宣言されているブロックの外なので変数yは参照できない
Next
 

        

        
~
  For x = 1 To 10
For x = 1 To 10
~
    Dim y As Single ' ブロック内のローカル変数

          
-
    Dim y As Single
 

        

        
 
    y = CSng(x)
    y = CSng(x)
+
  Next
 

        

        
~
  ' この部分は宣言されているブロックの外なので変数yは参照できない
Next
+
End Sub
 
}}
}}
 

        

        
~
1つ目と2つ目のForステートメントはそれぞれ別々のブロックを構成します。 そのため、それぞれのブロック内(Forステートメント内)で宣言されているローカル変数``y``は、独立した別々の変数となります。 異なるプロシージャで同名の変数が宣言されていてもそれぞれのプロシージャでは互いに影響しないのと同様、異なるブロックで同名の変数が宣言されていても互いに影響しません。 また、ブロック内で宣言されている変数``y``の有効範囲(スコープ)はそのブロック内のみとなるため、ブロック外から変数``y``を参照することもできません。
注意しなければならないのは、値を明示的に初期化しないブロック変数は、プロシージャを抜けるまでその値を保持し続けることです。
+

          
+
一方、プロシージャ内で宣言されているローカル変数``x``は、ブロック外(Forステートメントの外)で宣言されています。 この変数はプロシージャ内の各ブロックから参照することができます。
+

          
+
Forステートメントだけでなく、Ifなど他のステートメントもブロックを構成します。 IfとElseおよびElseIfはそれぞれ別のブロックとなる点に注意してください。
 

        

        
 
#code(vb){{
#code(vb){{
~
Sub Main()
Dim x, y As Integer
+
  Dim x As Integer = 1 ' プロシージャ内のローカル変数
 

        

        
~
  If x = 3 Then
For x = 1 To 2
+
    Dim y As Integer = 2 ' Ifブロック内のローカル変数
 

        

        
~
    Console.WriteLine(y)
    For y = 1 To 3
+
  Else
+
    Dim y As Integer = 3 ' Elseブロック内のローカル変数
+

          
+
    Console.WriteLine(y)
+
  End If
 

        

        
~
  ' この部分は宣言されているブロックの外なので変数yは参照できない
        Dim i As Integer
+
End Sub
+
}}
+

          
+
ブロックは階層構造を持ちます。 そのため、入れ子になったステートメントではブロックも入れ子になります。
+

          
+
#code(vb){{
+
Sub Main()
+
  Dim x As Integer = 1 ' プロシージャ内の変数x
+

          
+
  If x = 3 Then
+
    Dim y As Integer ' Ifブロック内の変数y
+

          
+
    For y = 2 To 5
+
      Dim z As Integer = y * 3 ' 入れ子になったブロック内の変数z
+

          
+
      Console.WriteLine(z)
+
    Next
 

        

        
~
    ' この部分は宣言されているブロックの外なので変数zは参照できない
        i = i + 1
+
  Else
+
    Dim y As Integer ' Elseブロック内の変数y
 

        

        
~
    For y = 1 To 3
        Console.WriteLine(i)
+
      Dim z As Integer = y * 2 ' 入れ子になったブロック内の変数z
 

        

        
+
      Console.WriteLine(z)
 
    Next
    Next
 

        

        
+
    ' この部分は宣言されているブロックの外なので変数zは参照できない
+
  End If
+

          
+
  ' この部分は変数yも変数zも参照できない
+
End Sub
+
}}
+

          
+
階層構造の上位にあるブロックから下位のブロックで宣言されている変数は参照できませんが、逆に下位にあるブロックから上位のブロックで宣言されている変数を参照することはできます。 プロシージャ内(ブロック外)で宣言されている変数は階層構造の最上位に位置することになります。
+

          
+
Forステートメントではループ変数の宣言も同時に行えるようになっていますが、この変数もForステートメントが構成するブロック内でのみ有効となります。
+

          
+
#code(vb){{
+
For x As Integer = 0 To 9
+
  ' Forステートメント(変数が宣言されているブロック)の内側では変数xを参照できる
+
  Console.WriteLine(x)
+
Next
+

          
+
' Forステートメント(変数が宣言されているブロック)の外なので変数xは参照できない
+
}}
+

          
+

          
+
*ブロック変数と初期値
+
値を明示的に初期化しないブロック変数は、プロシージャを抜けるまでその値を保持し続ける点に注意が必要です。
+

          
+
#code(vb){{
+
For x As Integer = 1 To 2
+
  For y As Integer = 1 To 3
+
    Dim i As Integer ' 初期値を指定せずに宣言したブロック内の変数
+

          
+
    i = i + 1
+

          
+
    Console.WriteLine(i)
+
  Next
 
Next
Next
 
}}
}}
 

        

        
133,17 64,23
 
6
6
 
}}
}}
 

        

        
~
この実行結果から分かるとおり、内側のForループを抜けても変数``i``の値は保持されています。 毎回初期化するようにするには、次のように変数の宣言と同時に初期化する必要があります。
この実行結果から分かるとおり、内側のForループを抜けても変数iの値は保持されています。 毎回初期化するようにするには、次のように変数の宣言と同時に初期化する必要があります。
 

        

        
 
#code(vb){{
#code(vb){{
~
For x As Integer = 1 To 2
Dim x, y As Integer
~
  For y As Integer = 1 To 3

          
~
    Dim i As Integer = 0 ' 初期値を指定して宣言したブロック内の変数 (ブロックに入るたびに0に初期化される)
For x = 1 To 2
 

        

        
~
    i = i + 1
    For y = 1 To 3
-

          
-
        Dim i As Integer = 0
-

          
-
        i = i + 1
-

          
-
        Console.WriteLine(i)
-

          
-
    Next
 

        

        
+
    Console.WriteLine(i)
+
  Next
 
Next
Next
 
}}
}}
 

        

        
156,17 93,23
 
1
1
 
}}
}}
 

        

        
~
初期化と宣言の位置が変われば動作も変わるため、ブロック変数を宣言する箇所には注意する必要があります。
または宣言部をブロックの外にするという方法もあります。
 

        

        
 
#code(vb){{
#code(vb){{
~
For x As Integer = 1 To 2
Dim x, y As Integer
~
  Dim i As Integer = 0 ' 初期値を指定して宣言したブロック内の変数

          
-
For x = 1 To 2
 

        

        
~
  For y As Integer = 1 To 3
    Dim i As Integer = 0
~
    i = i + 1

          
-
    For y = 1 To 3
-

          
-
        i = i + 1
-

          
-
        Console.WriteLine(i)
-

          
-
    Next
 

        

        
+
    Console.WriteLine(i)
+
  Next
 
Next
Next
 
}}
}}
 

        

        
179,51 122,4
 
3
3
 
}}
}}
 

        

        
+
*空のブロック
+
CやC#では中括弧``{ }``で囲まれた部分がブロックを構成します。 そのため次のように何らかのステートメントを使わなくても変数の有効範囲を限定するための空ブロックを構成することができます。
+

          
+
#code(cs){{
+
int x = 3;
+

          
+
{ // 空のブロック
+
  int y = 5; // ブロック内の変数
+
}
+

          
+
// この箇所はブロック外のため変数yを参照できない
+
}}
+

          
+
VB.NETでブロックを構成するにはなんらかのステートメントを使わなければならないので、このような記述をすることができません。
+

          
+
空のブロックを作成する1つの方法として、常に条件式が真となるIfステートメントを使用する方法があります。
+

          
+
#code(vb){{
+
Dim x As Integer = 3
+

          
+
If True Then ' ブロックを構成するためのIfステートメント
+
  Dim y As Integer = 5 ' ブロック内の変数
+
End If
+
}}
+

          
+
このほか、Withステートメントを使用することもできます。
+

          
+
#code(vb){{
+
Dim x As Integer = 3
+

          
+
With Nothing ' ブロックを構成するためのWithステートメント
+
  Dim y As Integer = 5 ' ブロック内の変数
+
End With
+
}}
+

          
+
Withステートメントで具体的なオブジェクトを指定する代わりに``Nothing``や``0``、``True``/``False``などが代用できますが、いずれもWithステートメント内でオブジェクトを参照しなければエラーにはなりません。
+

          
+

          
+
*ブロックより上位のスコープ
+
ブロック以外にもスコープを構成する要素には次のようなものが存在します。 また、それぞれの要素はスコープの階層構造の各レベルを構成します。
+
-[[プロシージャ>programming/vb.net/basics/07_procedure]]のレベル
+
-[[クラス>programming/vb.net/basics/12_class]]・[[モジュール>programming/vb.net/basics/08_module]]・[[構造体>programming/vb.net/basics/09_structure]]など型のレベル
+
-[[名前空間>programming/vb.net/basics/10_namespace]]のレベル
+

          
+
ブロックより上位のスコープについては、各ページおよび[[programming/vb.net/basics/11_accessibility]]を参照してください。
+

          
+