|   | 
  | 
連載
改訂版 
プロフェッショナルVB.NETプログラミング
Chapter 02  データ型の変化 
株式会社ピーデー
川俣 晶 
2004/03/04 | 
 | 
 
 | 
 VB 6では、As Newキーワードを使ってインスタンスを生成するなどの場合を除き、宣言した変数に何らかの初期値を入れたい場合にはそれを代入する必要があった。リスト2-22は、整数型の変数aの初期値として、整数123を設定する例である。
 
1: Private Sub Form_Load() 
2:   Dim a As Integer 
3:   a = 123 
4:   Debug.Print a 
5: End Sub 
 | 
 
 
 | 
 
  
リスト2-22
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  
リスト2-23 リスト2-22の実行結果
 | 
 VB.NETでは、Dimステートメントに初期値を直接記述することで、変数の宣言と初期値の設定を同時に行うことができる。リスト2-24は、それを記述した例である。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
2:   Dim a As Integer = 123 
3:   Trace.WriteLine(a) 
4: End Sub 
 | 
 
 
 | 
 
  
リスト2-24 リスト2-22をVB.NETで書き換えたプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  
リスト2-25 リスト2-24の実行結果
 | 
 このように、
Dim 変数名 As データ型 = 初期値を表す式
という書式で、宣言と初期値の設定を同時に行うことができる。一般に変数の初期化忘れがトラブルになることは珍しくないので、変数を宣言する際にはこの構文を用いて必ず初期化する習慣を付けるとよいだろう。
 配列を作成した時点で、特定のデータを配列内に設定したい場合がある。VB 6には、そのための構文は特に用意されておらず、普通の配列への代入手順で内容をセットする。例えば、リスト2-26のように記述する。
 
1: Private Sub Form_Load() 
2:   Dim a(2) As String 
3:   a(0) = "One" 
4:   a(1) = "Two" 
5:   a(2) = "Three" 
6:   For i = 0 To 2 
7:     Debug.Print a(i) 
8:   Next 
9: End Sub 
 | 
 
 
 | 
 
  
リスト2-26 配列に初期値を設定するプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  
リスト2-27 リスト2-26の実行結果
 | 
 VB.NETには、配列の初期化構文が用意されているので、これを用いることで、より簡潔にあらかじめ指定された値を持った配列を作成できる。リスト2-28は、上記のVB 6サンプルと同じ機能をVB.NETで記述したサンプル・ソースである。
 
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
2:   Dim a() As String = {"One", "Two", "Three"} 
3:   Dim i As Integer 
4:   For i = 0 To 2 
5:     Trace.WriteLine(a(i)) 
6:   Next 
7: End Sub 
 | 
 
 
 | 
 
  
リスト2-28 配列の初期化構文を使用したプログラム
 | 
 これを実行すると次のようになる。
| 
 | 
 
  
リスト2-29 リスト2-28の実行結果
 | 
 ここでポイントになるのは、2行目の配列の宣言である。まず、配列のサイズを数値で指定せず空のままにしておく。配列のサイズは初期化する項目の数から明確に決まるので、数値で指定する必要はない。そして、配列の宣言に続いてイコール記号を置き、中括弧内にカンマで区切って値を並べる。ここでは、3つの文字列を記述しているが、これにより、配列の要素数は3個であると確定する。この宣言により、One、Two、Threeという3つの文字列を含む要素数3の配列が作成される。
 VB 6では、ReDimで配列のサイズを変更する際、配列の次元数は問題にされない。つまり、最初に宣言されたときに2次元配列であることが明示されていない配列を、2次元配列にReDimしても正常に動作するということである。リスト2-30はそれを示したサンプル・ソースである。
 
 1: Private Sub Form_Load() 
 2:   Dim a() As Integer 
 3:   ReDim a(2, 2) 
 4:   For i = 0 To 2 
 5:     For j = 0 To 2 
 6:       a(i, j) = i + j 
 7:     Next 
 8:   Next 
 9:   For i = 0 To 2 
10:     For j = 0 To 2 
11:       Debug.Print a(i, j), 
12:     Next 
13:     Debug.Print 
14:   Next 
15: End Sub 
 | 
 
 
 | 
 
  
リスト2-30 ReDimにより配列の次元を変更するプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  
リスト2-31 リスト2-30の実行結果
 | 
 しかし、VB.NETでは配列数は厳密に管理されており、次元数を変更するような操作は実行することができない。例えば、2次元配列をReDimステートメントで指定するには、リスト2-32のように記述する必要がある。
 
 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
 2:   Dim a(,) As Integer 
 3:   ReDim a(2, 2) 
 4:   Dim i, j As Integer 
 5:   For i = 0 To 2 
 6:     For j = 0 To 2 
 7:       a(i, j) = i + j 
 8:     Next 
 9:   Next 
10:   For i = 0 To 2 
11:     For j = 0 To 2 
12:       Trace.Write(a(i, j) & ", ") 
13:     Next 
14:     Trace.WriteLine("") 
15:   Next 
16: End Sub 
 | 
 
 
 | 
 
  
リスト2-32 VB.NETでは、あらかじめ配列の次元を明示する必要がある
 | 
 これを実行すると以下のようになる。
 
0, 1, 2, 
1, 2, 3, 
2, 3, 4, 
 | 
 
 
 | 
 
  
リスト2-33 リスト2-32の実行結果
 | 
 ここで注目すべきポイントは、2行目の括弧内に入った1個のカンマ“,”記号である。ここにカンマ記号が1個入ることにより、これが2次元配列であることが明示される。2個のカンマが入れば3次元配列になるし、カンマがなければ1次元配列になる。
 VB.NETには配列を作成するいくつかの方法がある。リスト2-34はそれを示すサンプル・ソースである。
 
 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
 2:   Dim a(3) As Integer 
 3:   a(1) = 123 
 4:   Trace.WriteLine(a(1)) 
 5:   a = New Integer(3) {} 
 6:   Trace.WriteLine(a(1)) 
 7:   a(1) = 456 
 8:   Trace.WriteLine(a(1)) 
 9:   Dim b() As Integer = New Integer(3) {} 
10:   b(1) = 789 
11:   Trace.WriteLine(b(1)) 
12: End Sub 
 | 
 
 
 | 
 
  
リスト2-34 異なるいくつかの方法で配列を宣言しているプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  
リスト2-35 リスト2-34の実行結果
 | 
 2行目はごく常識的な配列の宣言である。5行目のように、配列そのものに新しい配列を代入すると、配列の中身をすべて入れ替えることができる。 新しい配列は「New Integer(3)」のように、Newキーワードとデータ型名で作成することもできる。この方法では、内容がすべて入れ替わるので、値が保存されることはなく、6行目のTrace.WriteLineでは初期化されたときの初期値である0が表示されることになる。Newを使った構文はDimステートメントとともに使用してもよく、9行目のように記述することも可能である(配列と初期化については、変数の初期化、配列の初期化も参照)。
 配列の共変性について、VB.NETの言語仕様では、以下のように記述されている。
| 
 2つの参照型AとBで、AがBの派生型である場合、型Aから型Bの互換性のある配列への変換が存在します(互換性のある配列とは、ランクおよび型が同じ配列です)。この関係を“配列の共変性”と呼びます。 
 | 
  書かれていることは難しいが、実例を見れば分かりやすいだろう。この特徴を使ったサンプル・プログラムをリスト2-36に示す。
 
 1: Public Class B 
 2:   Public n As Integer 
 3: End Class 
 4:  
 5: Public Class A 
 6:   Inherits B 
 7: End Class 
 8:  
 9: Public Class Form1 
10:   Inherits System.Windows.Forms.Form 
11:  
12: …Windows フォーム デザイナで生成されたコード… 
13:  
14:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
15:     Dim ar1(9) As A 
16:  
17:     Dim i As Integer 
18:     For i = 0 To 9 
19:       ar1(i) = New A() 
20:       ar1(i).n = i 
21:     Next 
22:  
23:     Dim ar2() As B 
24:     ar2 = ar1 
25:  
26:     For i = 0 To 9 
27:       Trace.WriteLine(ar2(i).n) 
28:     Next 
29:   End Sub 
30: End Class 
 | 
 
 
 | 
 
  
リスト2-36 配列の共変性により、配列を親クラスの配列として扱うプログラム
 | 
 これを実行すると以下のようになる。
 
 1: 0 
 2: 1 
 3: 2 
 4: 3 
 5: 4 
 6: 5 
 7: 6 
 8: 7 
 9: 8 
10: 9 
 | 
 
 
 | 
 
  
リスト2-37 リスト2-36の実行結果
 | 
 このソース・コードのポイントは24行目で、クラスAの配列を、クラスBの配列を保持する変数に代入してしまっている点にある。本来なら、型が異なる配列に代入することはできないはずである。しかし、これが可能であるのは、クラスAがクラスBを継承しているためである(継承については、継承とポリモーフィズム参照)。クラスAはクラスBとして扱うこともできるので、クラスAの配列は、クラスBの配列として扱うこともできるわけである。
 
 
	
		業務アプリInsider 記事ランキング
		
		
			本日
			月間