連載

改訂版
プロフェッショナルVB.NETプログラミング

Chapter 02  データ型の変化

株式会社ピーデー 川俣 晶
2004/03/04


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 変数の初期化

 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

 これを実行すると以下のようになる。

1:  123
リスト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で書き換えたプログラム

 これを実行すると以下のようになる。

1:  123
リスト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 配列に初期値を設定するプログラム

 これを実行すると以下のようになる。

One
Two
Three
リスト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 配列の初期化構文を使用したプログラム

 これを実行すると次のようになる。

One
Two
Three
リスト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により配列の次元を変更するプログラム

 これを実行すると以下のようになる。

0             1             2
1             2             3
2             3             4
リスト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 異なるいくつかの方法で配列を宣言しているプログラム

 これを実行すると以下のようになる。

123
0
456
789
リスト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の配列として扱うこともできるわけである。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 02 データ型の変化
    1.プリミティブ型のエイリアス/ VariantとObject/新しい整数型と整数型が表現できる数値範囲の拡大
    2.通貨、日付、構造体の変化/配列添え字の下限/配列のサイズ変更
  3.変数の初期化/配列の初期化/配列の次元数の変更/配列を作成するさまざまな方法/配列の共変性
    4.固定長文字列/構造体宣言/値型と参照型のパフォーマンスの相違
    5.値型と参照型の振る舞いの相違/日付と時刻の変更/日付時刻の書式化
    6.列挙型とその値/文字列代入によるメモリ消費量の違い/デフォルトのデータ型

「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH