|
|
連載
改訂版 プロフェッショナルVB.NETプログラミング
Chapter 01 基本構文の変化
株式会社ピーデー
川俣 晶
2004/02/19 |
|
ここでは、主にプログラム言語としての基本文法にかかわる部分の変化を解説している。例えば、数値のリテラルを記述する構文の変化などは、ここに含まれる。
BASIC言語の初期の時代には、データ型を識別するために、特定の記号を使用している場合があった。例えば、文字列型はドル記号($)、整数型はパーセント記号(%)といったルールを決めて、変数の名前などの後ろに付けた。この名残りがいまでも残っていて、記号が使用できる。VB 6で次のようなプログラム・コードを記述しても問題なく動作する。
1: Private Sub Form_Load()
2: Dim i As Integer
3: i% = 123
4: Debug.Print i
5: Dim l As Long
6: l& = 123&
7: Debug.Print l
8: Dim d As Currency
9: d@ = 123@
10: Debug.Print d
11: Dim s As Single
12: s! = 123!
13: Debug.Print s
14: Dim du As Double
15: du# = 123#
16: Debug.Print du
17: Dim st As String
18: st$ = "123"
19: Debug.Print st
20: End Sub
|
|
リスト1-1 「$」や「%」などの記号文字の付いた変数を使用したプログラム
|
これを実行すると以下のようになる。
1: 123
2: 123
3: 123
4: 123
5: 123
6: 123
|
|
リスト1-2 リスト1-1の実行結果
|
この機能は、VB.NETにも継承されている。だが、VB.NETでは、新しいデータ型が増えている。これらのデータ型に対応する記号文字は存在するのだろうか?(データ型については、データ型の変化を参照)。リスト1-3は、それを踏まえてVB.NETで実行可能な形に書き換えたサンプル・プログラムである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i As Integer
3: i% = 123
4: Trace.WriteLine(i)
5: Dim l As Long
6: l& = 123&
7: Trace.WriteLine(l)
8: Dim d As Decimal
9: d@ = 123@
10: Trace.WriteLine(d)
11: Dim s As Single
12: s! = 123.0!
13: Trace.WriteLine(s)
14: Dim du As Double
15: du# = 123.0#
16: Trace.WriteLine(du)
17: Dim st As String
18: st$ = "123"
19: Trace.WriteLine(st)
20: Dim b As Byte
21: b = 123
22: Trace.WriteLine(b)
23: Dim sh As Short
24: sh = 123
25: Trace.WriteLine(sh)
26: End Sub
|
|
リスト1-3 リスト1-1をVB.NETで書き換えたプログラム
|
これを実行すると以下のようになる。
1: 123
2: 123
3: 123
4: 123
5: 123
6: 123
7: 123
8: 123
|
|
リスト1-4 リスト1-3の実行結果
|
まず、VB 6のCurrency型がなくなり、VB.NETではDecimal型に取って代わったことに注目してみよう。VB 6でCurrency型に対応していた「@」記号は、VB.NETではDecimal型を表現するものに変化している。しかし、もともとVB 6に存在しなかったShort型には対応する記号文字はない。また、VB 6にもあったByte型についても対応する記号文字はない。
記号を入力する代わりに、データ型名のフルスペルを書き込むのは面倒に思えるかもしれないが、記号文字を使うのはあくまで互換のために用意された機能であり、フルスペルでデータ型名を書く方がお勧めである。
プログラム・コード中で定数を記述する際、しばしば、定数のデータ型を明示する必要に迫られる場合がある。そのような場合、VB 6では、型文字と新しいデータ型で述べた記号文字を定数に付加するといった方法で、データ型を明示した。しかし、記号文字が用意されないデータ型も生まれてきたので、何か代わりの方法が必要になってきた。VB.NETでは新しい方法で定数のデータ型を明示することができる。リスト1-5はそれを使用したサンプル・プログラムである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim a As Object
3: a = 123
4: Trace.WriteLine(a.GetType().FullName)
5: a = 123%
6: Trace.WriteLine(a.GetType().FullName)
7: a = 123&
8: Trace.WriteLine(a.GetType().FullName)
9: a = 123S
10: Trace.WriteLine(a.GetType().FullName)
11: a = 123I
12: Trace.WriteLine(a.GetType().FullName)
13: a = 123L
14: Trace.WriteLine(a.GetType().FullName)
15:
16: a = 1.23
17: Trace.WriteLine(a.GetType().FullName)
18: a = 1.23!
19: Trace.WriteLine(a.GetType().FullName)
20: a = 1.23#
21: Trace.WriteLine(a.GetType().FullName)
22: a = 1.23@
23: Trace.WriteLine(a.GetType().FullName)
24: a = 1.23F
25: Trace.WriteLine(a.GetType().FullName)
26: a = 1.23R
27: Trace.WriteLine(a.GetType().FullName)
28: a = 1.23D
29: Trace.WriteLine(a.GetType().FullName)
30: End Sub
|
|
リスト1-5 定数のデータ型を明示したプログラム
|
これを実行すると以下のようになる。
1: System.Int32
2: System.Int32
3: System.Int64
4: System.Int16
5: System.Int32
6: System.Int64
7: System.Double
8: System.Single
9: System.Double
10: System.Decimal
11: System.Single
12: System.Double
13: System.Decimal
|
|
リスト1-6 リスト1-5の実行結果
|
なお、リスト1-5で使用しているGetTypeメソッドは、型情報を持つオブジェクトを参照する機能であり、FullNameプロパティは型のフルネームの文字列を返すものである(これらの機能を用いて表示されているSystemで始まるデータ型名のフルネームについては、プリミティブ型のエイリアスを参照)。
リスト1-5の5、7、18、20、22行目は、従来どおりの記号を用いた記述方法を使ったものである。それに対して、9、11、13、24、26、28行目は、新しい記述方法である。数値のあとにアルファベット1文字を付加して、データ型を明示している。例えば5行目と11行目を見比べると分かるだろう。同じInteger型(表示結果はSystem.Int32)を示す数値を記述するために、古い「%」記号を付ける方法と、新しい「I」を付ける方法をそれぞれ使用している。VB.NETでは、後者の方法がお勧めである。実際、9行目のShort型に対応する記号文字はなく、記号文字で指定したくてもできないことになる。
VB 6では、1文字だけのデータを表すデータ型はなく、1文字を扱う場合も文字列型を使っていた。しかし、VB.NETでは、1文字を表すChar型(フルネームは、System.Char。Systemで始まるデータ型名については、プリミティブ型のエイリアスを参照)が導入されたことで事情が変わった。異なるプログラム言語間での相互運用性を維持したり、汎用クラス・ライブラリを利用したりするために、1文字の「文字列」ではなく、1文字の「文字」を表現する手段が必要になるケースが生じるようになった。
1文字の「文字列」と1文字の「文字」が区別されて扱われていることを、以下のサンプル・プログラムで確認してみよう(リスト1-7)。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim c1, c2 As Char
3: Dim o1, o2 As Object
4: c1 = "A"
5: c2 = "A"c
6: o1 = "A"
7: o2 = "A"c
8: Trace.WriteLine(c1.GetType().FullName)
9: Trace.WriteLine(c2.GetType().FullName)
10: Trace.WriteLine(o1.GetType().FullName)
11: Trace.WriteLine(o2.GetType().FullName)
12: End Sub
|
|
リスト1-7 1文字のデータに対してChar型と文字列型を使い分けたプログラム
|
これを実行すると以下のようになる。
1: System.Char
2: System.Char
3: System.String
4: System.Char
|
|
リスト1-8 リスト1-7の実行結果
|
5行目や7行目のように、ダブルクォート(")でくくった1文字の後ろに文字“c”を書けば、それは文字リテラルと見なされる。しかし、4行目や6行目のように文字“c”を書かない場合は、1文字の「文字列」と見なされる。結果の3行目と4行目を見れば、明らかだろう。
なお、文字列は2文字以上の長い文字列を書くことができるが、文字は当然1文字しか書くことができない。"AB"は正しいが、"AB"cは正しくない。また、ここでいう1文字は、Unicodeで扱われる単位を意味し、例えば複数の文字を合成して1文字とする合成文字を記述する場合、必ずしも人間が1文字として認識する単位と一致しない場合がある(Unicodeについての詳細は.NET Frameworkクラス・ライブラリを用いたテキストファイルの入出力で紹介している書籍『Unicode標準入門』を参照)。
業務アプリInsider 記事ランキング
本日
月間