2011-10-23T03:02:40の更新内容

programming/vb.net/basics/05_array/index.wiki.txt

current previous
12,52 12,18
 

                

                
 
#googleadunit(banner)
#googleadunit(banner)
 

                

                
~
*配列の宣言と要素の参照
*配列の宣言
~
配列の宣言と個々の要素を参照する方法はVB6と同じです。 ただし、VB6とは異なり、配列の下限は''Cなどの配列と同様の0''に固定されています。
配列の宣言はVB6と同じです。 ただし、VB6とは異なり、配列の下限は''Cなどの配列と同様の0''に固定されています。
 

                

                
 
#code(vb){{
#code(vb){{
 
' インデックスが 0 から 5 まで、要素数 6 の Integer型配列
' インデックスが 0 から 5 まで、要素数 6 の Integer型配列
~
Dim arr1(5) As Integer
Dim arr2(5) As Integer
+

                  
+
' インデックス0 (配列の先頭の要素) に 2 を代入
+
arr1(0) = 2
 

                

                
 
' インデックスが 0 から 9 まで、要素数 10 の String型配列
' インデックスが 0 から 9 まで、要素数 10 の String型配列
~
Dim arr2(9) As String
Dim arr1(9) As String
+

                  
+
' インデックス9 (配列の末尾の要素) に "text" を代入
+
arr2(9) = "text"
+
}}
+

                  
+
配列の範囲外を参照しようとした場合、実行時に例外IndexOutOfRangeExceptionがスローされます。
+

                  
+
#code(vb){{
+
' インデックスが 0 から 3 まで、要素数 4 の String型配列
+
Dim arr(3) As String
+

                  
+
arr(10) = "text" ' IndexOutOfRangeExceptionがスローされる
+
}}
+

                  
+
配列の要素数(長さ)を実行時に調べるには、配列のLengthプロパティ(後述)を参照します。
+

                  
+
なお、多次元配列は次のように宣言します。
+

                  
+
#code(vb){{
+
' 二次元配列 (要素数は11×11個)
+
Dim arr1(10, 10) As Integer
+

                  
+
' 三次元配列 (要素数は11×11×11個)
+
Dim arr2(10, 10, 10) As Integer
+

                  
+
' 空の二次元配列
+
Dim arr3(,) As Integer
+

                  
+
' 空の三次元配列
+
Dim arr4(,,) As Integer
 
}}
}}
 

                

                
~
*配列のサイズ変更
また、宣言時に要素数を指定しなかった場合に限り、ReDimステートメントで動的に配列のサイズを変更することができます。
+
宣言時に要素数を指定しなかった場合に限り、ReDimステートメントで動的に配列のサイズを変更することができます。
 

                

                
 
#code(vb){{
#code(vb){{
 
' 空の配列
' 空の配列
106,6 72,23
 
4
4
 
}}
}}
 

                

                
-
**多次元配列
-
多次元配列は次のように宣言します。
-

                  
-
#code(vb){{
-
' 二次元配列 (要素数は11×11個)
-
Dim arr1(10, 10) As Integer
-

                  
-
' 三次元配列 (要素数は11×11×11個)
-
Dim arr2(10, 10, 10) As Integer
-

                  
-
' 空の二次元配列
-
Dim arr3(,) As Integer
-

                  
-
' 空の三次元配列
-
Dim arr4(,,) As Integer
-
}}
-

                  
 
多次元配列でもReDimを使用して要素数を動的に変更することができます。
多次元配列でもReDimを使用して要素数を動的に変更することができます。
 

                

                
 
#code(vb){{
#code(vb){{
168,14 151,14
 
多少複雑になりますが、多次元配列でも同様の方法で行えます。
多少複雑になりますが、多次元配列でも同様の方法で行えます。
 

                

                
 
#code(vb){{
#code(vb){{
~
' 要素数は 2×5 になる
' 要素数は 5×5 になる
 
Dim arr1(,) As Integer = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}
Dim arr1(,) As Integer = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}
 

                

                
 
' 要素数は 2×2×5 になる
' 要素数は 2×2×5 になる
 
Dim arr2(,,) As Integer = {{{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}, {{10, 11, 12, 13, 14}, {15, 16, 17, 18, 19}}}
Dim arr2(,,) As Integer = {{{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}, {{10, 11, 12, 13, 14}, {15, 16, 17, 18, 19}}}
 
}}
}}
 

                

                
~
次のコードはこれと同じ要素を持つ配列を作成するためのコードです。
次のコードはこれと同じ要素を持つ配列を作成するためのコードです。 
 

                

                
 
#code(vb){{
#code(vb){{
 
Dim i, j, k, n As Integer
Dim i, j, k, n As Integer
211,41 194,8
 
Next i
Next i
 
}}
}}
 

                

                
~
*配列と繰り返し構文
*配列のプロパティ
~
[[programming/vb.net/basics/03_statement]]で解説したとおり、配列ではForステートメントとFor-Eachステートメントを使って繰り返しを行うことができます。
VB.NETの配列は、Arrayクラスから派生しています。 そのためいくつかのメソッドやプロパティを持っています。 まずはプロパティについて見てみます。
+

                  
+
#code(vb){{
+
Dim arr() As String = {"A", "B", "C", "D", "E"}
+

                  
+
' Forステートメントですべての要素について繰り返す
+
For i As Integer = 0 To arr.Length - 1
+

                  
+
    Console.Write("{0} ", arr(i))
+

                  
+
Next
+

                  
+
Console.WriteLine()
+

                  
+
' For-Eachステートメントですべての要素について繰り返す
+
For Each s As String In arr
+

                  
+
    Console.Write("{0} ", s)
+

                  
+
Next
+

                  
+
Console.WriteLine()
+
}}
+

                  
+
#prompt(実行結果){{
+
A B C D E 
+
A B C D E 
+
}}
+

                  
+
*配列のプロパティ・メソッド
+
VB.NETの配列は、Arrayクラスから派生しています。 そのためいくつかのプロパティやメソッドを持っています。
+

                  
+
**配列のプロパティ
+
まずは配列のプロパティについて見てみます。
 

                

                
 
#code(vb){{
#code(vb){{
 
' 一次元配列について
' 一次元配列について
275,8 225,8
 

                

                
 
Lengthプロパティでは配列に含まれるすべての要素数を知ることができます。 また、Rankプロパティでは次元を知ることができます。 次元毎の要素数を知りたい場合は次の項を参考にしてください。
Lengthプロパティでは配列に含まれるすべての要素数を知ることができます。 また、Rankプロパティでは次元を知ることができます。 次元毎の要素数を知りたい場合は次の項を参考にしてください。
 

                

                
~
**配列のメソッド
*配列のメソッド
~
続いて配列のインスタンスメソッドについて見てみます。
始めに配列のインスタンスメソッドについて見てみます。
 

                

                
 
#code(vb){{
#code(vb){{
 
' 一次元配列について
' 一次元配列について

programming/vb.net/basics/04_conversion/index.wiki.txt

current previous
11,12 11,10
 
--[[programming/netfx/string/3_formatting]]
--[[programming/netfx/string/3_formatting]]
 
--[[programming/netfx/locale/1_infoes]]
--[[programming/netfx/locale/1_infoes]]
 

                

                
+
ここではVB.NETに固有な型変換関数であるC&var{Xxx};を中心に説明しますが、それ以外の.NET Frameworkでサポートされる型変換(ToStringやParseなど)については[[programming/netfx/conversion/0_basetype]]で詳しく解説しています。
+

                  
 
#googleadunit(banner)
#googleadunit(banner)
 

                

                
 
*数値→数値変換
*数値→数値変換
~
数値から数値へ変換する場合、つまり数値の型を変える場合は従来通りC&var{Xxx};関数を使用できます。
数値から数値へ変換する場合、つまり数値の型を変える場合は従来通りC&var{Xxx};を使用できます。
 

                

                
 
#code(vb){{
#code(vb){{
 
Dim b As Byte = 15
Dim b As Byte = 15
36,7 34,7
 
bln = CBool(s = 7.0) ' bln = True
bln = CBool(s = 7.0) ' bln = True
 
}}
}}
 

                

                
~
浮動小数点値から整数値に変えるには、CInt関数などを使う方法もありますが、丸め方法を指定して整数値に変える必要がある場合はMath.Round()メソッドなどを使用する必要があります。 詳しくは[[programming/netfx/mathematics/0_math#FuncRound]]での解説を参照してください。
浮動小数点値から整数値に変えるには、CInt()などを使う方法もありますが、丸め方法を指定して整数値に変える必要がある場合はMath.Round()メソッドなどを使用する必要があります。 詳しくは[[programming/netfx/mathematics/0_math#FuncRound]]での解説を参照してください。
 

                

                
 
*数値→文字列変換
*数値→文字列変換
 
数値から文字列へ変換する場合には、CStr関数を使用することができます。
数値から文字列へ変換する場合には、CStr関数を使用することができます。
88,7 86,7
 
|N|三桁ことに区切り文字(カンマ)をつけて表記する。 整数値または実数値に対して使用する。|
|N|三桁ことに区切り文字(カンマ)をつけて表記する。 整数値または実数値に対して使用する。|
 
|P|パーセントとして表記する。 実数値に対して使用する。|
|P|パーセントとして表記する。 実数値に対して使用する。|
 

                

                
~
これらの書式指定文字に加え、桁数などを指定することで0埋め・右揃えなどを行うことも出来ます。 また、VBでサポートされていたFormat関数のような書式化を行うこともできます。 書式指定文字については、[[programming/netfx/string/3_formatting]]で詳しく解説しています。
これらの書式指定文字に加え数値を指定することで表記の桁数などを指定できます。
 

                

                
 
*文字列→数値変換
*文字列→数値変換
 
文字列から数値へ変換する場合には、C&var{Xxx};を使用することができます。
文字列から数値へ変換する場合には、C&var{Xxx};を使用することができます。

programming/vb.net/basics/02_operator/index.wiki.txt

current previous
16,22 16,20
 
#code(vb){{
#code(vb){{
 
Dim i As Integer
Dim i As Integer
 

                

                
~
i = 1 + 2   ' 加算 : i = 3
i = 1 + 2   ' 加算 i = 3
~
i = 3 - 1   ' 減算 : i = 2
i = 3 - 1   ' 減算 i = 2
~
i = 4 * 3   ' 乗算 : i = 12
i = 4 * 3   ' 乗算 i = 12
~
i = 6 / 2   ' 除算 : i = 3
i = 6 / 2   ' 除算 i = 3
~
i = 5 Mod 3 ' 剰余 : i = 2
i = 5 Mod 3 ' 剰余 i = 2
~
i = 5 \ 3   ' 商 : i = 1
i = 5 \ 3   ' 商 i = 1
~
i = 2 ^ 3   ' べき乗 : i = 8
i = 2 ^ 3   ' べき乗 i = 8
 

                

                
 
Dim s As String = "String"
Dim s As String = "String"
 

                

                
~
s = s + "文字列" ' 文字列の連結 : s = "String文字列"
s = s + "文字列" ' 文字列の連結 s = "String文字列"
~
s = s & "String" ' 文字列の連結 : s = "String文字列String"
s = s & "String" ' 文字列の連結 s = "String文字列String"
 
}}
}}
 

                

                
+
剰余と商、べき乗などは[[Mathクラス>programming/netfx/mathematics/0_math]]のメソッドを使って求めることもできます。
+

                  
 
*複合代入演算子
*複合代入演算子
 
VB.NETからは複合代入演算子が使用できるようになりました。 しかしながら、インクリメント演算子(++)、ディクリメント演算子(--)は存在しません。 また残念ながら、Modについては複合代入演算子が用意されていません。
VB.NETからは複合代入演算子が使用できるようになりました。 しかしながら、インクリメント演算子(++)、ディクリメント演算子(--)は存在しません。 また残念ながら、Modについては複合代入演算子が用意されていません。
 

                

                
60,74 58,13
 
b1 = True
b1 = True
 
b2 = False
b2 = False
 

                

                
~
b = b1 Or b2  ' 論理和 : b = True
b = b1 Or b2 ' b = True
~
b = b1 And b2 ' 論理積 : b = False
b = b1 And b2 ' b = False
~
b = b1 Xor b2 ' 排他的論理和 : b = True
b = b1 Xor b2 ' b = True
~
b = Not b1    ' 論理否定 : b = False
b = Not b1 ' b = False
 
}}
}}
 

                

                
~
**AndAlso演算子・OrElse演算子
VB.NETでは新たにAndAlsoとOrElseという演算子が追加されました。 これはショートサーキットによる評価を行うための演算子で、第一項がFalseの場合、AndAlsoは第二項を評価せずにFalseを返します。 同様に、第一項がTrueの場合、OrElseは第二項を評価せずに Trueを返します。 これらの真理値表をまとめると次のようになります。
+
VB.NETでは新たにAndAlsoとOrElseという演算子が追加されました。 これはショートサーキットによる評価を行うための演算子で、And/Or演算子とAndAlso/OrElse演算子の違いは、第二項が常に評価されるかどうかが異なる点にあります。 第一項がFalseの場合、AndAlsoは第二項を評価せずにFalseを返します。 同様に、第一項がTrueの場合、OrElseは第二項を評価せずに Trueを返します。
+

                  
+
And演算子とAndAlso演算子の違いをより明確にするため、次のようなコードを考えます。
+

                  
+
#code(vb){{
+
Module Module1
+

                  
+
    Sub Main()
+

                  
+
        Console.WriteLine("And演算子")
+

                  
+
        If Func1() And Func2() Then
+
            Console.WriteLine("成功")
+
        Else
+
            Console.WriteLine("失敗")
+
        End If
+

                  
+
        Console.WriteLine("AndAlso演算子")
+

                  
+
        If Func1() AndAlso Func2() Then
+
            Console.WriteLine("成功")
+
        Else
+
            Console.WriteLine("失敗")
+
        End If
+

                  
+
    End Sub
+

                  
+
    Function Func1() As Boolean
+

                  
+
        Console.WriteLine("Func1が呼び出されました")
+

                  
+
        Return False
+

                  
+
    End Function
+

                  
+
    Function Func2() As Boolean
+

                  
+
        Console.WriteLine("Func2が呼び出されました")
+

                  
+
        Return True
+

                  
+
    End Function
+

                  
+
End Module
+
}}
+

                  
+
この例ではFunc1は失敗、Func2は成功します。 And演算子を使った場合では、Func1が失敗となってもFunc2も呼び出されます。 一方AndAlso演算子を使った場合は、Func1が失敗した時点で式 'Func1() AndAlso Func2()' がFalseとなる事が確定するため、Func2は呼び出す必要がなくなります(Func2を''評価しない'')。
+

                  
+
そのため、上記のコードの実行結果はこのようになります。
+

                  
+
#prompt(実行結果){{
+
And演算子
+
Func1が呼び出されました
+
Func2が呼び出されました
+
失敗
+
AndAlso演算子
+
Func1が呼び出されました
+
失敗
+
}}
+

                  
+
AndAlso演算子・OrElse演算子の真理値表をまとめると次のようになります。
 

                

                
 
|*Or演算子の真理値表
|*Or演算子の真理値表
 
|第一項|第二項|結果|h
|第一項|第二項|結果|h
155,46 92,7
 
|True|False|False|
|True|False|False|
 
|True|True|True|
|True|True|True|
 

                

                
~
**If演算子
**Eqv演算子、Imp演算子
+
VB.NET 2008(Visual Studio 2008)からは、If演算子がサポートされるようになりました。 これはCやC#の三項演算子 ''~?~:~'' と同様のものです。 If演算子は、If(&var{条件式};, &var{真の場合};, &var{偽の場合};)という形式で使用します。
+

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

                  
+
Console.WriteLine("{0}は{1}です", i, If(i Mod 2 = 0, "偶数", "奇数"))
+
}}
+

                  
+
If演算子と似たものとしてIIf関数が用意されていましたが、IIf関数では結果はObject型で返されるのに対し、If演算子では結果が第二項・第三項の型で返される点が異なります。
+

                  
+
#code(vb){{
+
Dim a As Object = IIf(True, "2", 3) ' aには文字列"2"が代入される
+
Dim b As Object = IIf(False, "2", 3) ' bには数値3が代入される
+
Dim c As Integer = If(True, "2", 3) ' 二項目と三項目で型が異なるためコンパイルエラー
+
}}
+

                  
+
なお、単に式の評価と真偽の場合の処理を1行で記述するだけなら、If~Then~Elseステートメントを使用することも出来ます。
+

                  
+
#code(vb){{
+
Dim i As Integer = 1
+
Dim oddeven As String
+

                  
+
If i Mod 2 = 0 Then oddeven = "偶数" Else oddeven = "奇数"
+

                  
+
Console.WriteLine("{0}は{1}です", i, oddeven)
+
}}
+

                  
+
また、If演算子では二項形式でも使用できます。 この場合、第一項がNothingの場合は第二項の値が返され、Nothing以外の場合は第一項の値がそのまま返されます。 ただし、If演算子を二項形式で使用する場合、第一項は参照型(もしくはnull許容型)でなければなりません。
+
#code(vb){{
+
Dim str As String = Nothing
+

                  
+
Console.WriteLine(If(str, "Nothing")) ' 文字列"Nothing"が出力される
+

                  
+
str = "foo"
+

                  
+
Console.WriteLine(If(str, "Nothing")) ' strの値(文字列"foo")が出力される
+
}}
+

                  
+
**Eqv演算子・Imp演算子
 
VB6以前に存在したEqv, Imp演算子はVB.NETではなくなりました。 これらの演算子と同様の結果を得るには次のようにします
VB6以前に存在したEqv, Imp演算子はVB.NETではなくなりました。 これらの演算子と同様の結果を得るには次のようにします
 

                

                
 
#code(vb){{
#code(vb){{
205,21 103,7
 
b = (Not b1) Or b2 ' VB6以前の「b = b1 Imp b2」と等価
b = (Not b1) Or b2 ' VB6以前の「b = b1 Imp b2」と等価
 
}}
}}
 

                

                
~
*ビット演算子
*ビットシフト演算子
+
And, Or, Xor, Notの各演算子は、整数型に対してはビット演算子として動作します。
+

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

                  
+
i = 8 Or 5                    ' Or演算 : i = &h0000000D
+
i = &h12345678 And &hFF0000FF ' And演算 : i = &h12000078
+
i = &h00FF00FF Xor &h0000FFFF ' Xor演算 : i = &h00FFFF00
+
i = Not &h00FF00FF            ' Not演算 : i = &hFF00FF00
+
}}
+

                  
+
なお、長大なビット値を操作するために[[BitArray>programming/netfx/collections/9_misc]]といったコレクションを使用することもできます。
+

                  
+
**ビットシフト演算子
 
VB.NET 2003(Visual Studio .NET 2003)からは、VB.NETでも算術ビットシフト演算子がサポートされるようになりました。 ビットシフト演算子はその名の通り、数のビット表記に対してその表記を右または左にシフトする演算子です。
VB.NET 2003(Visual Studio .NET 2003)からは、VB.NETでも算術ビットシフト演算子がサポートされるようになりました。 ビットシフト演算子はその名の通り、数のビット表記に対してその表記を右または左にシフトする演算子です。
 

                

                
 
算術的には、1ビット右にシフトする事は数を2で除することと等しく、1ビット左にシフトする事は数を2で乗ずる事と等しい演算です。 なお、ビットシフト演算子はその特性上、整数型(Byte, Short, Integer, Long)に対してのみ使用できます。 ビットシフト演算子は、下の例のようにシフトする対称の値を演算子の左の項に書き、右側にシフトする量を記述します。
算術的には、1ビット右にシフトする事は数を2で除することと等しく、1ビット左にシフトする事は数を2で乗ずる事と等しい演算です。 なお、ビットシフト演算子はその特性上、整数型(Byte, Short, Integer, Long)に対してのみ使用できます。 ビットシフト演算子は、下の例のようにシフトする対称の値を演算子の左の項に書き、右側にシフトする量を記述します。
227,12 111,12
 
#code(vb){{
#code(vb){{
 
Dim i As Integer
Dim i As Integer
 

                

                
~
i = 8 >> 2 ' 算術右シフト : i = 2
i = 8 >> 2 ' 算術右シフト i = 2
~
i = 3 << 2 ' 算術左シフト : i = 12
i = 3 << 2 ' 算術左シフト i = 12
 

                

                
 
i = 5
i = 5
~
i = i >> 1 ' 算術右シフト : i = 2
i = i >> 1 ' 算術右シフト i = 2
~
i = i << 3 ' 算術左シフト : i = 16
i = i << 3 ' 算術左シフト i = 16
 
}}
}}
 

                

                
 
また、ビットシフトと代入を同時に行う複合代入演算子も用意されています。
また、ビットシフトと代入を同時に行う複合代入演算子も用意されています。
241,8 125,8
 
Dim i As Integer
Dim i As Integer
 

                

                
 
i = 5
i = 5
~
i >>= 1 ' 算術右シフト : i = 2
i >>= 1 ' 算術右シフト i = 2
~
i <<= 3 ' 算術左シフト : i = 16
i <<= 3 ' 算術左シフト i = 16
 
}}
}}
 

                

                
 
#navi(..)
#navi(..)

programming/vb.net/basics/07_procedure/index.wiki.txt

current previous
1,7 1,7
 
${smdncms:title,プロシージャ(Sub, Function)}
${smdncms:title,プロシージャ(Sub, Function)}
 
${smdncms:keywords,プロシージャ,オーバーロード,関数,Sub,Function}
${smdncms:keywords,プロシージャ,オーバーロード,関数,Sub,Function}
 
#navi(..)
#navi(..)
~
プロシージャはC/C++言語で言う関数のことであり、 Pascalでは値を返さない関数を手続きと呼んでいます。 VB.NETのプロシージャは「手続き」という意味ですが、値を返すか返さないかに関わらずこのように呼ばれます。 モジュールに属するものは特にプロシージャと呼ばれ、またクラスや構造体に属するプロシージャは特にメソッドと呼ばれる事が多いようです。 なお、値を返さないSubプロシージャはサブルーチン、値を返すFunctionプロシージャは関数・ファンクションという用語で区別されることもあるようです。
プロシージャはC/C++言語で言う関数のことであり、 Pascalでは値を返さない関数を手続きと呼んでいます。 VB.NETのプロシージャは「手続き」という意味ですが、値を返すか返さないかに関わらずこのように呼ばれます。 また、モジュールではプロシージャと呼ばれますが、クラスや構造体に属するプロシージャはメソッドと呼ばれます。
 

                

                
 
プロシージャにはよく使われる一連の処理の流れを記述します。 このようにすることで何度も同じコードを書く手間を減らすことができます。
プロシージャにはよく使われる一連の処理の流れを記述します。 このようにすることで何度も同じコードを書く手間を減らすことができます。
 

                

                
12,14 12,14
 
#googleadunit(banner)
#googleadunit(banner)
 

                

                
 
*VB.NETでのプロシージャとVB6からの変更点
*VB.NETでのプロシージャとVB6からの変更点
~
VB.NETのプロシージャには値を返さないSubプロシージャと、値を返すFunctionプロシージャが存在します。 両者の違いは値を返すかどうかだけです。 また、プロパティ構文を成すプロシージャをプロパティプロシージャと言います。 プロシージャは値を返すか否かに関わらず、任意の数・任意の型の引数を取ることができます。 引数はプロシージャに対して渡す情報ととらえることができます。
VB.NETのプロシージャには値を返さないSubプロシージャと、値を返すFunctionプロシージャが存在します。 また、プロパティ構文を成すプロシージャをプロパティプロシージャと言います。 プロシージャは値を返すか否かに関わらず、任意の数・任意の型の引数を取ることができます。 引数はプロシージャに対して渡す情報ととらえることができます。
 

                

                
 
プロシージャの宣言方法はVB6以前とほとんど変わりありませんが、一部変更になった部分もあります。 まず、その変更点をまとめておきます(すべてVB.NETでの仕様です)。
プロシージャの宣言方法はVB6以前とほとんど変わりありませんが、一部変更になった部分もあります。 まず、その変更点をまとめておきます(すべてVB.NETでの仕様です)。
 
-引数の渡し方は既定でByValとなる
-引数の渡し方は既定でByValとなる
 
-ByRefで渡されたプロパティ引数は、プロパティでの変更が反映される
-ByRefで渡されたプロパティ引数は、プロパティでの変更が反映される
 
-Subプロシージャを呼び出す場合、常に引数を括弧でくくる必要がある
-Subプロシージャを呼び出す場合、常に引数を括弧でくくる必要がある
 
-Returnキーワードを用いてSubプロシージャの呼び出し元に戻ることができる
-Returnキーワードを用いてSubプロシージャの呼び出し元に戻ることができる
~
-Returnキーワードを用いてFunctionプロシージャの戻り値を返すことができる
-Returnキーワードを使用してFunctionプロシージャの戻り値を返すことができる
 
-Static修飾子を指定してプロシージャを宣言することはできない
-Static修飾子を指定してプロシージャを宣言することはできない
 

                

                
 
*宣言・呼び出し
*宣言・呼び出し
42,7 42,7
 
End Function
End Function
 
}}
}}
 

                

                
~
これらのプロシージャを呼び出す場合は次のようにします。 VB.NETでは引き続きCallでプロシージャを呼び出すことができます。 CallでFunctionプロシージャを呼び出した場合、戻り値は特に代入されず無視されます。
これらのプロシージャを呼び出す場合は次のようにします。 VB.NETでは引き続きCallでプロシージャを呼び出すことができます。 この場合、Functionプロシージャの戻り値は破棄されます。
 

                

                
 
#code(vb){{
#code(vb){{
 
TestProcedure1()
TestProcedure1()
102,7 102,7
 
}}
}}
 

                

                
 

                

                
~
また、式の途中にFunctionプロシージャの呼び出しを含めることで、その戻り値を直接使用することもできます。
また、式の途中で戻り値を直接使用することもできます。
 

                

                
 
#code(vb){{
#code(vb){{
 
Sub Main()
Sub Main()
110,13 110,13
 
    Dim returnValue As Integer
    Dim returnValue As Integer
 

                

                
 
    ' 戻り値を10倍する事で 0, 10, 20 .... 90 のランダムな数値を取得する
    ' 戻り値を10倍する事で 0, 10, 20 .... 90 のランダムな数値を取得する
~
    returnValue = 10 * GetRandomValue()
    returnValue = 10 * FunctionProcedure()
 

                

                
 
    Console.WriteLine("戻り値: {0}", returnValue)
    Console.WriteLine("戻り値: {0}", returnValue)
 

                

                
 
End Sub
End Sub
 

                

                
~
Function GetRandomValue() As Integer
Function FunctionProcedure() As Integer
 

                

                
 
    ' 10未満のランダムな数値を返す
    ' 10未満のランダムな数値を返す
 
    Return CInt(Rnd() * 10)
    Return CInt(Rnd() * 10)
125,7 125,7
 
}}
}}
 

                

                
 
*プロシージャの中断
*プロシージャの中断
~
ReturnおよびExitステートメント(Exit Sub、Exit Function)を使用することでプロシージャの処理を中断することができます。 FunctionプロシージャではReturnは戻り値を返すために使用されますが、戻り値を返すと同時にそれ以降の処理も中断します。
ReturnおよびExit Sub、Exit Functionを使用することでプロシージャの処理を中断することができます。 FunctionプロシージャではReturnは戻り値を返すために使用されますが、返すと同時にそれ以降の処理も中断します。
 

                

                
 
#code(vb){{
#code(vb){{
 
Sub SubProcedure()
Sub SubProcedure()
162,8 162,6
 
End Function
End Function
 
}}
}}
 

                

                
+
ExitステートメントでFunctionプロシージャの処理を中断した場合、プロシージャ名に戻り値を代入している場合はその値、代入していない場合はデフォルトの値(参照型ではNothing、値型では0など)が戻り値として返されます。
+

                  
 
*ByValとByRef
*ByValとByRef
 
引数の渡し方には値渡しと参照渡しの二種類があります。 引数リストの宣言でByValを付加すると値渡し、ByRefを付加すると参照渡しで変数の値が渡されます。
引数の渡し方には値渡しと参照渡しの二種類があります。 引数リストの宣言でByValを付加すると値渡し、ByRefを付加すると参照渡しで変数の値が渡されます。
 

                

                
231,8 229,6
 
ByRef Value: 7
ByRef Value: 7
 
}}
}}
 

                

                
+
なお、値のコピーとインスタンスのコピーを混同しないようにしてください。 値型では値のコピーとインスタンスのコピーは同じですが、参照型では値のコピーとは同じインスタンスを参照するようにすることで、インスタンスのコピーとは1つのインスタンスからその複製を作ることです。 参照型の値渡し(ByVal)で渡されるのはどのインスタンスを参照するかという情報のコピーであり、参照渡し(ByRef)で変化するのは変数が参照するインスタンスです。 値型と参照型の違いについては[[programming/vb.net/basics/12_class]]で解説しています。
+

                  
 
*省略可能な引数
*省略可能な引数
 
VB.NETではプロシージャの引数を省略可能にすることができます。 省略可能な引数は宣言部にOptionalをつけますが、Optionalをつけた引数より後ろにある引数にもOptionalをつけなければなりません。
VB.NETではプロシージャの引数を省略可能にすることができます。 省略可能な引数は宣言部にOptionalをつけますが、Optionalをつけた引数より後ろにある引数にもOptionalをつけなければなりません。
 

                

                
412,7 408,7
 
End Sub
End Sub
 
}}
}}
 

                

                
~
幸い、この例のようにすべての型についてAbs()プロシージャを定義しなくても、すでに[[Math.Abs()メソッド>programming/netfx/mathematics/0_math#FuncAbsSign]]が提供されているのでこれを使うことができます。
幸い、すべての型についてAbs()プロシージャを定義しなくても、Math.Abs()メソッドが提供されているのでこれを使うことができます。
 

                

                
 
オーバーロードに際して、そのプロシージャがオーバーロードされていることを明示的に示す目的でOverloadsキーワードを付加することができます。 一つのプロシージャにOverloadsキーワードを付加した場合、ほかのオーバーロードされるべきプロシージャにもこのキーワードをつけなければなりません。
オーバーロードに際して、そのプロシージャがオーバーロードされていることを明示的に示す目的でOverloadsキーワードを付加することができます。 一つのプロシージャにOverloadsキーワードを付加した場合、ほかのオーバーロードされるべきプロシージャにもこのキーワードをつけなければなりません。
 

                

                
427,6 423,6
 
End Function
End Function
 
}}
}}
 

                

                
~
プロシージャをオーバーロードする場合、当然プロシージャ名は同じでなければなりません。 また、引数の数・順序・型が一つでも異なっていないとオーバーロードすることはできません。 つまり''戻り値の型や引数の名前の違いだけではオーバーロードできません''。 ちなみに、プロシージャの名前と引数の数・順序・型の要素をまとめてシグネチャ(もしくはシグニチャ、signature)といいます。
プロシージャをオーバーロードする場合、当然プロシージャ名は同じでなければなりません。 また、引数の数・順序・型が一つでも異なっていないとオーバーロードすることはできません。 つまり''戻り値の型や引数の名前の違いだけではオーバーロードできません''。 ちなみに、プロシージャの名前と引数の数・順序・型の要素をまとめてシグネチャといいます。
 

                

                
 
#navi(..)
#navi(..)

programming/vb.net/basics/00_console/index.wiki.txt

current previous
4,11 4,11
 

                

                
 
Visual Studio .NET で作成できるVB.NETアプリケーションのうち、主に使用されるものは次の三つです。
Visual Studio .NET で作成できるVB.NETアプリケーションのうち、主に使用されるものは次の三つです。
 

                

                
~
:Windowsアプリケーション|フォームをベースとしたWindowsアプリケーション。 (従来のVBがもっとも得意としたアプリケーションの形式で、VB.NETでは多くの機能が強化されているが、その分言語仕様を中心とした変更点が多い)
:Windowsアプリケーション|フォームをベースとした、従来のVBがもっとも得意としたWindowsアプリケーション。 VB.NETでは多くの機能が強化されているが、その分言語仕様を中心とした変更点が多く、最初はその違いにとまどうかもしれない。
 
:クラスライブラリ|単体で実行できるユーザーインターフェイスを持たない、コードベースのクラスライブラリ。 VB.NETだけでなく他の.NET言語からも使用できるライブラリを作ることができる。
:クラスライブラリ|単体で実行できるユーザーインターフェイスを持たない、コードベースのクラスライブラリ。 VB.NETだけでなく他の.NET言語からも使用できるライブラリを作ることができる。
~
:コンソールアプリケーション|文字だけからなるコンソールのみを用いたアプリケーション。 ウィンドウを使用しないアプリケーションや、デバッグ、テスト用のアプリケーションなどで用いる。
:コンソールアプリケーション|文字だけからなるコンソールのみを用いたアプリケーション。 使用しないアプリケーションや、デバッグ、テスト用のアプリケーションなどで用いる。
 

                

                
~
この他にも、エディションやバージョンによって作成できるアプリケーションにはいくつか種類があります。 ここでは、上記のコンソールアプリケーションを用いて解説をしていきます。
以下では、このうちのコンソールアプリケーションを用いて解説をしていきます。
 

                

                
 
-関連するページ
-関連するページ
 
--[[programming/netfx/classlibrary/0_howtocreate]]
--[[programming/netfx/classlibrary/0_howtocreate]]
68,21 68,19
 
End Module
End Module
 
}}
}}
 

                

                
~
このプログラムにおけるエントリーポイントは、上から二行目の「Sub Main()」の部分です。 これはMainプロシージャの宣言部分です。 VB.NETではMainと言う名前の[[プロシージャ>programming/vb.net/basics/07_procedure]]がアプリケーションのエントリーポイント、つまりプログラムの開始点となります。
このプログラムにおけるエントリーポイントは、上から二行目の「Sub Main()」の部分です。 これはMainプロシージャの宣言部分です。 VB.NETではMainと言う名前のプロシージャがアプリケーションのエントリーポイント、つまりプログラムの開始点となります。
 

                

                
 
**Mainプロシージャの形式
**Mainプロシージャの形式
 
Mainプロシージャの形式には数種類ありますが、先の形式は一番単純な形式です。 Mainプロシージャではコマンドライン引数を受けることができ、またエラーなどで終了する場合に通知するエラーコードなどを返すこともできます。 それらの形式を次の表にまとめておきます。
Mainプロシージャの形式には数種類ありますが、先の形式は一番単純な形式です。 Mainプロシージャではコマンドライン引数を受けることができ、またエラーなどで終了する場合に通知するエラーコードなどを返すこともできます。 それらの形式を次の表にまとめておきます。
 

                

                
 
|*Mainプロシージャの形式
|*Mainプロシージャの形式
~
|~宣言の形式|~概要|h
|宣言の形式|概要|h
 
|Sub Main()|コマンドライン引数を受け取らない。 エラーコードを返さない。|
|Sub Main()|コマンドライン引数を受け取らない。 エラーコードを返さない。|
 
|Function Main() As Integer|コマンドライン引数を受け取らない。 エラーコードを返す。|
|Function Main() As Integer|コマンドライン引数を受け取らない。 エラーコードを返す。|
 
|Sub Main(ByVal args() As String)|コマンドライン引数を受け取る。 エラーコードを返さない。|
|Sub Main(ByVal args() As String)|コマンドライン引数を受け取る。 エラーコードを返さない。|
 
|Function Main(ByVal args() As String) As Integer|コマンドライン引数を受け取る。 エラーコードを返す。|
|Function Main(ByVal args() As String) As Integer|コマンドライン引数を受け取る。 エラーコードを返す。|
 

                

                
~
Mainプロシージャ(エントリーポイント)は[[モジュール>programming/vb.net/basics/08_module]]もしくは[[クラス>programming/vb.net/basics/12_class]]のどちらかで宣言することができます。 クラスにMainプロシージャを宣言する場合は、これらの宣言の先頭に共有メソッドであることを表す「Shared」を付加する必要があります。
さらに、[[クラス>programming/vb.net/basics/12_class]]がエントリーポイントを持つ場合は、これらの宣言の先頭に「Shared」を付加する必要があります。 参考までに、クラスがもっとも長い形式のエントリーポイントを持つ場合のコードで「Hello, world!」を表示するプログラムを記述すると次のようになります。
+

                  
+
参考までに、上記の最も長い形式のエントリーポイントをクラスで宣言し、「Hello, world!」を表示するプログラムを記述すると次のようになります。
 

                

                
 
#code(vb){{
#code(vb){{
 
Class Class1
Class Class1
98,18 96,15
 
End Class
End Class
 
}}
}}
 

                

                
~
*コンソールと入出力
*コンソールへの出力
~
コンソールアプリケーションにおいて、コンソールへの文字列の表示やキーボードからの入力を受け付けるにはConsoleクラスを使います。
まず、一行だけ文字を表示するには、Console.WriteLine()メソッドを使用します。
+

                  
+
**コンソールへの出力 (標準出力)
+
まず、文字列を表示するには、Console.WriteLine()メソッドを使用します。
 

                

                
 
#code(vb){{
#code(vb){{
 
Module Module1
Module Module1
 

                

                
 
    Sub Main()
    Sub Main()
 

                

                
~
        Console.WriteLine("文字列を出力")
        Console.WriteLine("一行だけ出力")
 

                

                
 
    End Sub
    End Sub
 

                

                
117,54 112,10
 
}}
}}
 

                

                
 
#prompt(実行結果){{
#prompt(実行結果){{
~
文字列を出力
一行だけ出力
 
}}
}}
 

                

                
~
変数の値を表示したい場合なども、Console.WriteLine()メソッドを使います。
さらに、途中で変数の値などを含めて表示するには次のようにします。
+

                  
+
#code(vb){{
+
Module Module1
+

                  
+
    Sub Main()
+

                  
+
        Dim i As Integer = 15
+

                  
+
        Console.WriteLine(i)
+

                  
+
    End Sub
+

                  
+
End Module
+
}}
+

                  
+
#prompt(実行結果){{
+
15
+
}}
+

                  
+
改行したい場合は、引数に何も指定せずにConsole.WriteLine()メソッドを呼び出します。
+

                  
+
#code(vb){{
+
Module Module1
+

                  
+
    Sub Main()
+

                  
+
        Console.WriteLine("1行目")
+

                  
+
        Console.WriteLine()
+

                  
+
        Console.WriteLine("3行目")
+

                  
+
    End Sub
+

                  
+
End Module
+
}}
+

                  
+
#prompt(実行結果){{
+
1行目
+

                  
+
3行目
+
}}
+

                  
+
さらに、文字列の途中に変数の値などを含めて表示するには次のようにします。
 

                

                
 
#code(vb){{
#code(vb){{
 
Module Module1
Module Module1
187,7 138,7
 
この部分が文字や数値に置き換わり表示されます。
この部分が文字や数値に置き換わり表示されます。
 
}}
}}
 

                

                
~
上記の例にあるように、中括弧 ''{ }'' で囲まれた部分が、その後に指定されているパラメータに置き換えられて表示されます。 中括弧 ''{ }'' の中の番号の順に並んでいるパラメータが表示されます。
{ }で囲まれた部分が、その後に指定されているパラメータに置き換えられて表示されます。 { }の中の番号の順に並んでいるパラメータが表示されます。 
 

                

                
 
#code(vb){{
#code(vb){{
 
Module Module1
Module Module1
205,10 156,8
 
0:三番目 1:二番目 2:一番目
0:三番目 1:二番目 2:一番目
 
}}
}}
 

                

                
~
中括弧 ''{ }'' の中に指定する文字列を変えることで0埋めや右寄せなどの指定をすることもできます。 これについては[[programming/netfx/string/3_formatting]]で解説しています。
*コンソールからの入力
~

                  
コンソールから文字列を入力するにはConsole.ReadLine()メソッドを使用します。 
+
**コンソールからの入力 (標準入力)
+
コンソールから文字列を入力するにはConsole.ReadLine()メソッドを使用します。
 

                

                
 
#code(vb){{
#code(vb){{
 
Module Module1
Module Module1
287,91 236,5
 
入力された数値: 123.4567
入力された数値: 123.4567
 
}}
}}
 

                

                
+
**標準エラーへの出力
+
標準エラーへ出力を行う場合は、Console.Errorプロパティのメソッドを使います。 出力先が異なるだけで、使い方はConsole.WriteLineと同様です。 リダイレクトされていない場合は、通常の出力と同様にコンソールウィンドウに表示されます。
+

                  
+
#code(vb){{
+
Module Module1
+

                  
+
    Sub Main()
+

                  
+
        ' 標準出力へ文字列を出力
+
        Console.WriteLine("標準出力")
+

                  
+
        ' 標準エラーへ文字列を出力
+
        Console.Error.WriteLine("標準エラー")
+

                  
+
    End Sub
+

                  
+
End Module
+
}}
+

                  
+
#prompt(実行結果){{
+
標準出力
+
標準エラー
+
}}
+

                  
+
*コマンドライン引数
+
コンソールアプリケーションを起動するときに指定されたコマンドライン引数を取得するには、Mainプロシージャの引数argsを参照します。
+

                  
+
#code(vb){{
+
Module Module1
+

                  
+
    Sub Main(ByVal args() As String)
+

                  
+
        Console.WriteLine("指定されたコマンドライン引数: {0}個", args.Length)
+

                  
+
        For Each arg As String In args
+

                  
+
            Console.WriteLine(arg)
+

                  
+
        Next
+

                  
+
    End Sub
+

                  
+
End Module
+
}}
+

                  
+
#prompt(実行例){{
+
E:\>ConsoleApplication1.exe /? foo /file:bar.txt
+
指定されたコマンドライン引数: 3個
+
/?
+
foo
+
/file:bar.txt
+
}}
+

                  
+
Mainプロシージャで引数argsを受けとるようにしていない場合でも、Environment.GetCommandLineArgs()メソッドを呼び出すことでコマンドライン引数を取得することができます。 Environment.GetCommandLineArgs()メソッドでは、配列の先頭にアプリケーションのファイル名が入る点に注意してください。
+

                  
+
#code(vb){{
+
Module Module1
+

                  
+
    Sub Main()
+

                  
+
        Dim args() As String
+

                  
+
        args = Environment.GetCommandLineArgs()
+

                  
+
        Console.WriteLine("指定されたコマンドライン引数: {0}個", args.Length)
+

                  
+
        For Each arg As String In args
+

                  
+
            Console.WriteLine(arg)
+

                  
+
        Next
+

                  
+
    End Sub
+

                  
+
End Module
+
}}
+

                  
+
#prompt(実行例){{
+
E:\>ConsoleApplication1.exe /? foo /file:bar.txt
+
指定されたコマンドライン引数: 4個
+
ConsoleApplication1.exe
+
/?
+
foo
+
/file:bar.txt
+
}}
+

                  
 
#navi(..)
#navi(..)
 

                

                

programming/vb.net/basics/03_statement/index.wiki.txt

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

                

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

                

                
~
この構文のうち ''[ ]''でくくった部分は省略可能な部分です。
この構文のうち[]でくくった部分は省略可能な部分です。
 

                

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

                

                
 
この実行結果から分かるとおり、偶数でも素数でもある2はただ単に素数であるとだけ表示されますが、これは最初の分類に引っかかった後はほかの分類に引っかからないからです。 すなわち、VB.NETのCaseはCなどのcaseラベルとは異なりフォールスルーしません。
この実行結果から分かるとおり、偶数でも素数でもある2はただ単に素数であるとだけ表示されますが、これは最初の分類に引っかかった後はほかの分類に引っかからないからです。 すなわち、VB.NETのCaseはCなどのcaseラベルとは異なりフォールスルーしません。
 

                

                
~
また、Select Caseステートメントは文字列を元にした分類にも使うことが出来ます。 (次の例では、Select CaseのCaseを省略しています)
*For〜Nextステートメント
+

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

                  
+
Select s
+

                  
+
    Case "あいう", "えお"
+
        Console.WriteLine("ひらがな")
+

                  
+
    Case "abc", "ABC"
+
        Console.WriteLine("アルファベット")
+

                  
+
    Case Else
+
        Console.WriteLine("その他")
+

                  
+
End Select
+
}}
+

                  
+
*For-Nextステートメント
 
Forステートメントは繰り返す回数が決まっている場合に使用します。 Forステートメントでは今何回繰り返したかを覚えておくためのカウンタ変数が必要になります。 構文の形式は次の通りです。
Forステートメントは繰り返す回数が決まっている場合に使用します。 Forステートメントでは今何回繰り返したかを覚えておくためのカウンタ変数が必要になります。 構文の形式は次の通りです。
 

                

                
 
#code(vb){{
#code(vb){{
251,8 232,8
 

                

                
 
このようにして宣言したカウンタ変数は、Forステートメント内のみで有効であることに注意してください。 Forステートメントの外から参照することはできません。
このようにして宣言したカウンタ変数は、Forステートメント内のみで有効であることに注意してください。 Forステートメントの外から参照することはできません。
 

                

                
~
*For-Each-Nextステートメント
*For〜Each〜Nextステートメント
~
For-Eachステートメントは配列など特定の要素の集まり([[コレクション>programming/netfx/collections]])に対して、そのすべての要素を順番に一つずつ抜き出しながら繰り返す場合に使用します。 For-Eachステートメントでは抜き出した要素を扱うための変数を用意しておく必要があり、その変数の型は当然要素を格納できる型である必要があります。 構文の形式は次の通りです。
 For-Eachステートメントは特定の要素の集まり(コレクション)に対して、そのすべての要素を一つずつ抜き出して繰り返す場合に使用します。 For-Eachステートメントでは抜き出した要素を扱うための変数を用意しておく必要があり、その変数の型は当然要素を格納できる型である必要があります。 構文の形式は次の通りです。
 

                

                
 
#code(vb){{
#code(vb){{
 
For Each 要素変数 In コレクション
For Each 要素変数 In コレクション
260,33 241,7
 
Next [要素変数]
Next [要素変数]
 
}}
}}
 

                

                
~
For-EachステートメントはForステートメントをより簡単にしたようなものなので動作は容易に予想できると思います。 次のコードは配列に含まれるすべての要素を抜き出して表示するコードです。
基本的にForステートメントと同じなので問題ないと思います。 次のコードは配列に含まれるすべての要素を抜き出して表示するコードです。
+

                  
+
#code(vb){{
+
' 配列
+
Dim arr() As Integer = {0, 1, 2, 3, 4, 5}
+

                  
+
' 抜き出した要素を格納するための変数
+
Dim i As Integer
+

                  
+
' すべての要素について繰り返す
+
For Each i In arr
+

                  
+
    Console.WriteLine(i)
+

                  
+
Next
+
}}
+

                  
+
#prompt(実行結果){{
+
0
+
1
+
2
+
3
+
4
+
5
+
}}
+

                  
+
二次元配列に対してFor-Eachステートメントを使用した場合も、一次元配列と同様に1つずつ要素が抜き出されます。
 

                

                
 
#code(vb){{
#code(vb){{
 
' 二次元配列
' 二次元配列
315,8 270,8
 
Forステートメント同様、For-EachステートメントでもVB.NET 2003 (Visual Studio .NET 2003)からは、ステートメント内で使用できる要素変数をステートメント部で宣言できるようになりました。
Forステートメント同様、For-EachステートメントでもVB.NET 2003 (Visual Studio .NET 2003)からは、ステートメント内で使用できる要素変数をステートメント部で宣言できるようになりました。
 

                

                
 
#code(vb){{
#code(vb){{
~
' 配列
' 二次元配列
~
Dim arr() As Integer = {0, 1, 2, 3, 4, 5}
Dim arr(,) As Integer = {{0, 1, 2}, {3, 4, 5}}
 

                

                
 
' すべての要素について繰り返す
' すべての要素について繰り返す
 
For Each i As Integer In arr
For Each i As Integer In arr
326,10 281,8
 
Next
Next
 
}}
}}
 

                

                
~
For-Eachステートメントで列挙できるもの、列挙するために必要な要件、そして列挙する際の動作などは[[programming/netfx/enumeration]]で詳しく解説しています。
*While〜While Endステートメント
~

                  
Whileステートメントは繰り返す回数は決まっていないが、繰り返しを続ける(または、やめる)条件がわかっている場合に使用します。 構文の形式は次の通りです。 ちなみにVB.NETでは他のブロック構造との整合性を保つためにWendはサポートされず、While Endを使わなければなりません。
+
*While-End Whileステートメント
+
Whileステートメントは繰り返す回数ではなく、繰り返しを続ける(または、やめる)条件が決まっている場合に使用します。 構文の形式は次の通りです。 VB.NETでは他のブロック構造との整合性を保つためにWendキーワードは使用せず、代わりにEnd Whileを使わなければなりません。
 

                

                
 
#code(vb){{
#code(vb){{
 
While 条件式
While 条件式
337,11 290,11
 
End While
End While
 
}}
}}
 

                

                
~
この条件式が成り立っている限り(式が真である限り)繰り返されます。 条件が常に成り立ってしまうようにコーディングすると無限ループしてしまうので注意が必要です。 意図的に無限ループにすることもありますが、その場合でも通常はループを中止するためのコードを記述します。
この条件式が成り立っている限り(式が真である限り)繰り返されます。 条件が常に成り立ってしまうようにコーディングすると無限ループしてしまうので注意が必要です(意図的に無限ループにすることもありますが、その場合でも通常はループを中止するためのコードを記述します)。
 
#code(vb){{
#code(vb){{
 
Dim i As Integer = 0
Dim i As Integer = 0
 

                

                
~
' i が 5 未満の間はループを繰り返す
' i が 10 未満の間はループを繰り返す
 
While i < 5
While i < 5
 

                

                
 
    Console.WriteLine(i)
    Console.WriteLine(i)
360,53 313,46
 
4
4
 
}}
}}
 

                

                
~
比較のため、Forステートメントを使って上記のコードと同様の動作をするコードを記述すると次のようになります。
*Do〜Loopステートメント
+

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

                  
+
For i = 0 To 4 Step 1
+

                  
+
    Console.WriteLine(i)
+

                  
+
Next
+
}}
+

                  
+
*Do-Loopステートメント
 
Do-LoopステートメントはWhileステートメントと似ていますが、Whileとは異なり様々なバリエーションの条件を付けることができます。 その構文を次に示します。
Do-LoopステートメントはWhileステートメントと似ていますが、Whileとは異なり様々なバリエーションの条件を付けることができます。 その構文を次に示します。
 

                

                
 
-''先に''条件をチェックし、条件が''成り立っている間''ループを続ける構文
-''先に''条件をチェックし、条件が''成り立っている間''ループを続ける構文
-
-
 
#code(vb){{
#code(vb){{
 
Do While 条件式
Do While 条件式
 
    [ステートメント]
    [ステートメント]
 
Loop
Loop
 
}}
}}
 
-ステートメントを実行した''後で''条件をチェックし、条件が''成り立っている間''ループを続ける構文
-ステートメントを実行した''後で''条件をチェックし、条件が''成り立っている間''ループを続ける構文
-
-
 
#code(vb){{
#code(vb){{
 
Do
Do
 
    [ステートメント]
    [ステートメント]
 
Loop While 条件式
Loop While 条件式
 
}}
}}
 
-''先に''条件をチェックし、条件が''成り立つまで''ループを続ける構文
-''先に''条件をチェックし、条件が''成り立つまで''ループを続ける構文
-
-
 
#code(vb){{
#code(vb){{
 
Do Until 条件式
Do Until 条件式
 
    [ステートメント]
    [ステートメント]
 
Loop
Loop
 
}}
}}
 
-ステートメントを実行した''後で''条件をチェックし、条件が''成り立つまで''ループを続ける構文
-ステートメントを実行した''後で''条件をチェックし、条件が''成り立つまで''ループを続ける構文
-
-
 
#code(vb){{
#code(vb){{
 
Do
Do
 
    [ステートメント]
    [ステートメント]
 
Loop Until 条件式
Loop Until 条件式
 
}}
}}
 
-''無限に''ループを繰り返し、ステートメントを実行する構文
-''無限に''ループを繰り返し、ステートメントを実行する構文
-
-
 
#code(vb){{
#code(vb){{
 
Do
Do
 
    [ステートメント]
    [ステートメント]
 
Loop
Loop
 
}}
}}
 

                

                
~
次の例は、Do-Loop Untilを使った繰り返しの例です。
一番最後の構文を使用する場合は、何らかの条件が整った時点でExit Do (後述)を用いてループから抜ける必要があります。
 

                

                
 
#code(vb){{
#code(vb){{
 
Dim i As Integer = 0
Dim i As Integer = 0
429,49 375,8
 
4
4
 
}}
}}
 

                

                
~
次の例は、上記の例をDo While-Loopを使って書き換えた例です。
*ループステートメントの中断
~

                  
ForやWhileなどのステートメントでは、ループの途中でループから抜けることができます。 その場合にはExitを使います。 ForループではExit For、WhileループではExit Whileのように使います。
+
#code(vb){{
+
Dim i As Integer = 0
+

                  
+
' i が 5 未満の間はループを繰り返す
+
Do While i < 5
+

                  
+
    Console.WriteLine(i)
+

                  
+
    i += 1
+

                  
+
Loop
+
}}
+

                  
+
#prompt(実行結果){{
+
0
+
1
+
2
+
3
+
4
+
}}
+

                  
+
これは、While-End Whileを使って次のように記述する事もできます。
+

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

                  
+
' i が 5 未満の間はループを繰り返す
+
While i < 5
+

                  
+
    Console.WriteLine(i)
+

                  
+
    i += 1
+

                  
+
End While
+
}}
+

                  
+
While &var{条件式};、 Until &var{条件式};で条件式を記述しない場合でも、[[Exitステートメント>#ExitStatement]]を使用することでループを中断することができます。
+

                  
+
*ループステートメントの中断とスキップ
+
**Exitステートメント (ループの中断) [#ExitStatement]
+
ForやWhileなどのステートメントでは、ループの途中でループから抜けることができます。 その場合にはExitステートメントを使います。 これはCやC#のfor文におけるbreakに相当するものです。 ForループではExit For、WhileループではExit Whileのように使います。
 

                

                
 
#code(vb,Forループを中断する例){{
#code(vb,Forループを中断する例){{
 
Dim i As Integer
Dim i As Integer
516,126 421,4
 
3
3
 
}}
}}
 

                

                
+
入れ子になっているループ構造の中でExitステートメントを実行する場合は、最も内側にあり、Exitで指定したものに対応するループ構文が中断される点に注意が必要です。 次の例では二重のForステートメントの内側でExit Forステートメントを実行しています。
+

                  
+
#code(vb,二重のForループを中断する例){{
+
For i As Integer = 0 To 3
+

                  
+
    For j As Integer = 0 To 3
+

                  
+
        ' j が 2 になったら内側のjに対するループを中止
+
        If j = 2 Then Exit For
+

                  
+
        Console.WriteLine("({0}, {1})", i, j)
+

                  
+
    Next
+

                  
+
Next
+

                  
+
Console.WriteLine("ループ終了")
+
}}
+

                  
+
#prompt(実行結果){{
+
(0, 0)
+
(0, 1)
+
(1, 0)
+
(1, 1)
+
(2, 0)
+
(2, 1)
+
(3, 0)
+
(3, 1)
+
ループ終了
+
}}
+

                  
+
次の例は、先の例を少し変えて、外側をWhileステートメントにし、Forステートメントの内側でExit Whileステートメントを実行しています。
+

                  
+
#code(vb,入れ子になったループを中断する例){{
+
Dim i As Integer = 0
+

                  
+
While i <= 3
+

                  
+
    For j As Integer = 0 To 3
+

                  
+
        ' j が 2 になったら外側のWhileのループを中止
+
        If j = 2 Then Exit While
+

                  
+
        Console.WriteLine("({0}, {1})", i, j)
+

                  
+
    Next
+

                  
+
    i += 1
+

                  
+
End While
+

                  
+
Console.WriteLine("ループ終了")
+
}}
+

                  
+
#prompt(実行結果){{
+
(0, 0)
+
(0, 1)
+
ループ終了
+
}}
+

                  
+
この例においてExit Whileの代わりにExit Forとすると内側のForのループを中断するようになり、最初に示したコードと同様の動作となります。
+

                  
+
#code(vb,入れ子になったループを中断する例){{
+
Dim i As Integer = 0
+

                  
+
While i <= 3
+

                  
+
    For j As Integer = 0 To 3
+

                  
+
        ' j が 2 になったら内側のForのループを中止
+
        If j = 2 Then Exit For
+

                  
+
        Console.WriteLine("({0}, {1})", i, j)
+

                  
+
    Next
+

                  
+
    i += 1
+

                  
+
End While
+

                  
+
Console.WriteLine("ループ終了")
+
}}
+

                  
+
#prompt(実行結果){{
+
(0, 0)
+
(0, 1)
+
(1, 0)
+
(1, 1)
+
(2, 0)
+
(2, 1)
+
(3, 0)
+
(3, 1)
+
ループ終了
+
}}
+

                  
+
Exitステートメントはここで紹介した繰り返し構文の他にも、[[プロシージャ>programming/vb.net/basics/07_procedure]]の中断でも使われます。
+

                  
+
**Continueステートメント (ループのスキップ) [#ContinueStatement]
+
VB.NET 2005 (Visual Studio 2005)からはContinueステートメントが使えるようになりました。 Continueステートメントを使うと、ループの途中で残りの処理をスキップし、ループ処理の先頭に戻ることができます。 これはCやC#のfor文におけるcontinueに相当するものです。 Continueステートメントでスキップした場合、Continue以降の処理は実行されなくなります。 Exitステートメントと同様、ForループではContinue For、WhileループではContinue Whileのように使います。
+

                  
+
#code(vb,Forループの途中でスキップする例){{
+
Dim i As Integer
+

                  
+
For i = 0 To 4
+

                  
+
    ' i が 3 の時はスキップ
+
    If i = 3 Then Continue For
+

                  
+
    Console.WriteLine(i)
+

                  
+
Next
+
}}
+

                  
+
#prompt(実行結果){{
+
0
+
1
+
2
+
4
+
}}
+

                  
+
Continueステートメントも、Exitステートメント同様に最も内側にあり、Continueで指定したものに対応するループ構文がスキップされます。
+

                  
 
#navi(..)
#navi(..)

programming/vb.net/basics/09_structure/index.wiki.txt

current previous
39,7 39,7
 

                

                
 
この構造体は長方形座標を扱うRECT構造体のVB.NET版の一例です。 参考までにこれとほぼ等価なVB6でのコードを記述しておきました。
この構造体は長方形座標を扱うRECT構造体のVB.NET版の一例です。 参考までにこれとほぼ等価なVB6でのコードを記述しておきました。
 

                

                
~
VB.NETではType〜End Typeではなく、Structure〜End Structureを用いて構造体を宣言します。 また、フィールド・メソッドを含めて構造体のすべてのメンバに[[アクセシビリティ>programming/vb.net/basics/11_accessibility]]を設定できるようになりました。 このためメンバはDimやPublic、Privateを用いて宣言します。 Dimで宣言した構造体のメンバはPublic扱いとなります。 そのため、上記の例にあるフィールド(構造体内の変数)はすべてPublicとなります。
VB.NETではType〜End Typeではなく、Structure〜End Structureを用いて構造体を宣言します。 また、すべてのメンバ(フィールドとも言う)はDimを用いて宣言します。 これはメンバに[[アクセシビリティ>programming/vb.net/basics/11_accessibility]]を設定できるようになったためです。(つまり、PublicやPrivateで宣言することもできます。 Dimで宣言した構造体のメンバはPublic扱いになります。)
 

                

                
 
このように宣言した構造体を実際に使う場合の構文についてはVB6とかわりありません。
このように宣言した構造体を実際に使う場合の構文についてはVB6とかわりありません。
 

                

                
95,7 95,7
 
End Module
End Module
 
}}
}}
 

                

                
~
このように、VB.NETでは構造体にメソッドを持たせることができます。 上記の例におけるMeキーワードは、構造体自身がメンバを参照するためのキーワードで、たとえば引数のleftとメンバのLeftを区別するために用いています。 区別する必要がなければ次のようにMeキーワードを省略することもできます。
このように、VB.NETでは構造体にメソッドを持たせることができます。 Meキーワードは構造体自身がメンバを参照するためのキーワードで、たとえば引数のleftとメンバのLeftを区別するために用いています。 区別する必要がなければ次のようにMeキーワードを省略することもできます。
 

                

                
 
#code(vb){{
#code(vb){{
 
Sub SetRect(ByVal l As Integer, ByVal t As Integer, ByVal r As Integer, ByVal b As Integer)
Sub SetRect(ByVal l As Integer, ByVal t As Integer, ByVal r As Integer, ByVal b As Integer)
126,69 126,7
 
End Function
End Function
 
}}
}}
 

                

                
~
ただ、この場合はメソッドではなくプロパティにした方が設計的には優れているかもしれません。 プロパティについては後述します。
ただ、この場合はメソッドではなくプロパティにした方が設計的には優れているかもしれません。 プロパティについてはこの次で説明します。
+

                  
+
*コンストラクタ
+
構造体にNewという名前のメソッドを作成すると、それはコンストラクタとして扱われます。 コンストラクタは構造体変数が宣言されたときに呼び出される特殊なメソッドで、主にメンバ変数の初期化を行います。 ただし、クラスのコンストラクタとは異なり、構造体におけるコンストラクタは必ず1つ以上の引数を取る必要があります。 引数のないコンストラクタは暗黙的に作成されています。
+

                  
+
次のコードは先ほどのRect構造体に、宣言時に初期化できるようなコンストラクタを追加した例です。
+

                  
+
#code(vb){{
+
Structure Rect
+

                  
+
    Dim Left As Integer
+
    Dim Top As Integer
+
    Dim Right As Integer
+
    Dim Bottom As Integer
+

                  
+
    Sub New(ByVal l As Integer, ByVal t As Integer, ByVal r As Integer, ByVal b As Integer)
+

                  
+
        Left = l
+
        Top = t
+
        Right = r
+
        Bottom = b
+

                  
+
    End Sub
+

                  
+
     :
+
    以下同じ
+
     :
+
     :
+

                  
+
End Structure
+
}}
+

                  
+
そして、変数宣言時にこのコンストラクタを使用する場合は次のようにNewキーワードを使用します。
+

                  
+
#code(vb){{
+
' コンストラクタを使用した例
+
Dim r As New Rect(160, 120, 640, 480)
+

                  
+
' 次のコードは上のコードと等価です
+
Dim r As Rect
+
r.SetRect(160, 120, 640, 480)
+
}}
+

                  
+
コンストラクタをもつ構造体でも、コンストラクタを呼び出さずにNewキーワードを使用して初期化することが出来ます。 この場合、暗黙のコンストラクタが呼び出され、構造体内の各フィールドは0など(参照型ならNothing)のデフォルト値に初期化されます。
+

                  
+
#code(vb){{
+
' コンストラクタを使用しない例
+
Dim r As New Rect
+

                  
+
Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+
}}
+

                  
+
#prompt(実行結果){{
+
(0, 0)-(0, 0)
+
}}
+

                  
+
Newキーワードを使用せずに単に変数として宣言した場合もこれと同じ動作となります。 言い換えると、明示的にコンストラクタを呼び出さない場合は、変数として宣言した時点で暗黙のコンストラクタにより初期化されるとも言えます。
+

                  
+
#code(vb){{
+
Dim r As Rect
+

                  
+
Console.WriteLine("({0}, {1})-({2}, {3})", r.Left, r.Top, r.Right, r.Bottom)
+
}}
 

                

                
 
*プロパティ
*プロパティ
 
プロパティはすでにVBを使ったことがある方であれば概要は分かると思います。 ただ、VB6以前でのクラスのプロパティプロシージャの構文とは多少異なります。 プロパティ構文は次のようになっています。
プロパティはすでにVBを使ったことがある方であれば概要は分かると思います。 ただ、VB6以前でのクラスのプロパティプロシージャの構文とは多少異なります。 プロパティ構文は次のようになっています。
311,4 249,45
 
Width: 480, Height: 360
Width: 480, Height: 360
 
}}
}}
 

                

                
-
*コンストラクタ
-
構造体にNewという名前のメソッドを作成すると、それはコンストラクタとして扱われます。 コンストラクタは構造体変数が宣言されたときに呼び出される特殊なメソッドで、主にメンバ変数の初期化を行います。 ただし、構造体のコンストラクタは必ず引数を取る必要があります。 引数のないコンストラクタは暗黙的に作成されています。
-

                  
-
次のコードは先ほどのRect構造体に、宣言時に初期化できるようなコンストラクタを追加した例です。
-

                  
-
#code(vb){{
-
Structure Rect
-

                  
-
    Dim Left As Integer
-
    Dim Top As Integer
-
    Dim Right As Integer
-
    Dim Bottom As Integer
-

                  
-
    Sub New(ByVal l As Integer, ByVal t As Integer, ByVal r As Integer, ByVal b As Integer)
-

                  
-
        Left = l
-
        Top = t
-
        Right = r
-
        Bottom = b
-

                  
-
    End Sub
-

                  
-
     :
-
    以下同じ
-
     :
-
     :
-

                  
-
End Structure
-
}}
-

                  
-
そして、変数宣言時にこのコンストラクタを使用する場合は次のようにNewキーワードを使用します。
-

                  
-
#code(vb){{
-
' コンストラクタを使用した例
-
Dim r As New Rect(160, 120, 640, 480)
-

                  
-
' 次のコードは上のコードと等価です
-
Dim r As Rect
-
r.SetRect(160, 120, 640, 480)
-
}}
-

                  
 
#navi(..)
#navi(..)