連載
プロフェッショナルVB.NETプログラミング
第2回 データ型の処理
(株)ピーデー
川俣 晶
2002/04/04
|
|
そのほかのデータ型の互換性
そのほか、いくつかのデータ型に関する互換性を調べてみよう。以下は、いくつかのデータ型をVB 6で記述したサンプル・ソースである。
1: Private Type TypeA
2: s1 As String * 2
3: s2 As String * 2
4: End Type
5:
6: Private Type TypeB
7: s As String * 4
8: End Type
9:
10: Private Sub Form_Load()
11: Dim c As Currency
12: c = 105
13: c = c * 1.05
14: Debug.Print c
15:
16: Dim d As Date
17: d = "2002/04/01"
18: Debug.Print d
19:
20: Dim a As TypeA
21: a.s1 = "AB"
22: a.s2 = "CD"
23: Dim b As TypeB
24: LSet b = a
25: Debug.Print b.s
26: End Sub
|
|
いくつかのデータ型を使用したVB 6のサンプル・プログラム9 |
これを実行すると以下のようになる。
見ての通り、Currency型、Date型を使い、Typeステートメントでユーザー定義型を定義して、LSetステートメントで異なるユーザー定義型の間で内容を代入するということを行っている。では、これに相当するソースをVB.NETで記述するとどうなるだろうか。以下が実際に記述してみた例である。
1: Private Structure TypeA
2: Dim s1 As String
3: Dim s2 As String
4: End Structure
5:
6: Private Structure TypeB
7: Dim s As String
8: End Structure
9:
10: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
11: Dim c As Decimal
12: c = 105
13: c = c * 1.05
14: Trace.WriteLine(c)
15:
16: Dim d As Date
17: d = "2002/04/01"
18: Trace.WriteLine(d)
19: Trace.WriteLine(d.ToString("yyyy'年'MM'月'dd'日'"))
20:
21: Dim a As TypeA
22: a.s1 = LSet("AB", 2)
23: a.s2 = LSet("CD", 2)
24: Dim b As TypeB
25: b.s = LSet(a.s1 & a.s2, 4)
26: Trace.WriteLine(b.s)
27: End Sub
|
|
サンプル・プログラム9に相当するVB.NETのサンプル・プログラム10 |
これを実行すると以下のようになる。
110.25
2002/04/01 0:00:00
2002年04月01日
ABCD
|
|
サンプル・プログラム10の実行結果 |
これらにはさまざまな相違があるので、順番に見ていこう。
11行目のDecimal型は、Currency型の置き換えとして存在するデータ型だ。Currency型はVB.NETではサポートされないので使用することはできない。それに対して、Decimal型はVsiual Basic専用ではなく、ほかの.NET Framework上のプログラム言語でも使用できる共通のデータ型である。そのため、C#で作成された経理計算ライブラリをVisual Basicから呼び出して利用する、というようなシナリオもスムーズに実現するようになる。
次は16行目のDate型である。一見、16〜18行目は、何らVB 6から変更なく機能しているかのように見えるが、結果を見ると、VB 6は日付だけを表示しているのに対して、VB.NETでは日付と時刻を表示していることが分かる。もちろん、時刻は指定していないので、「0:00:00」という内容になっているものの、表示はなされてしまっている。この相違は、VB 6のDate型が内部で保持する倍精度浮動小数点型を文字列に変換するルールと、VB.NETのDate型が内部で保持するDateTime構造体の文字列への変換ルールが異なることによって発生したものである。Date型を何も指定せずに文字列に変換させる場合、VB 6では日付と時刻を含む文字列を生成する。しかし、時刻が「00:00:00」の場合は日付のみを含む文字列を生成する。これは日付と時刻を分離して扱っていた旧世代のBasic言語との互換性のための挙動と思われる。言語に対して中立な.NET Frameworkのクラス・ライブラリでは、このような互換のための配慮は継承されていないようで、単純に文字列に変換すると、条件に関係なく常に時刻を含む文字列に変換される。VB 6での動作をVB.NETでも正確に再現したい場合は、書式を明示的に指定するなどの必要がある。
逆のいい方をすればVB.NETのDate型はDateTime構造体に相当するので、DateTime構造体が持つメソッドやプロパティを利用することもできる。例えば19行目のように、書式化された文字列に変換するToStringメソッドを呼び出して、望み通りの書式に整形させることもできる。
さて、次は、ユーザー定義のデータ型である。まず。1行目と6行目を見ていただきたい。VB 6のTypeキーワードがVB.NETではStructureに変わっていることが分かると思う。これも、ほかのプログラム言語と共通の構造体と呼ばれる機能に整合させるためのもので、Visual Basicで定義した構造体は、ほかのプログラム言語から参照することができる。また、構造体内部の変数の宣言に、Dimキーワードが付加されていることも大きな変更点だ。構造体の中にはメソッドなども書き込むことができるので、Dimキーワードを付けて変数であることを明示する必要が生じたのである。構造体の詳しい話は後でまた取りあげる。
次に、2行目などで、固定長文字列が可変長文字列の宣言に書き換えられている点に注意していただきたい。VB.NETには固定長文字列は用意されていない。文字列はすべて可変長である。文字列の長さに関する詳しい説明についても後でまた取りあげる。
さらに、VB.NETではLSet、RSetステートメントも存在しないため、VB 6でのサンプルの20〜24行目と等価なコードをVB.NETで記述することはできない。強いてほぼ同じ機能を記述したのが、VB.NETサンプルの21〜25行目である。LSet関数は、左寄せで、指定された長さの文字列を得る関数である。今回の例では、文字列長は2や4に決まっているのでLSet関数を使う意味はないが、サンプル・ソースとして意味を明確にするために記述してみた。
更新履歴 |
【2002.4.16】本ページの第7パラグラフにおいて、「この相違は、VB 6のDate型が内部的に倍精度浮動小数点型でデータを保持しているのに対して、VB.NETのDate型はクラス・ライブラリのDateTimeクラスによって実現していることから発生したものである。DateTimeクラスは、日付と時刻の双方を保持する機能を持つため、そのまま表示させると日付と時刻の双方を表示する。」となっていましたが、これは誤りでした。お詫びして訂正させていただきます。 |
|
Insider.NET 記事ランキング
本日
月間