連載

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

第2回 データ型の処理

(株)ピーデー
川俣 晶
2002/04/04

Page1 Page2 Page3 Page4 Page5 Page6

そのほかのデータ型の互換性

 そのほか、いくつかのデータ型に関する互換性を調べてみよう。以下は、いくつかのデータ型を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

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

110.25
2002/04/01
ABCD
サンプル・プログラム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関数を使う意味はないが、サンプル・ソースとして意味を明確にするために記述してみた。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第2回 データ型の処理
    1.まずは小さなプログラムから
    2.整数型の表現力
  3.そのほかのデータ型の互換性
    4.同じデータ型の変数の宣言
    5.配列のサイズ変更
    6.配列の次元数の変更

更新履歴
【2002.4.16】本ページの第7パラグラフにおいて、「この相違は、VB 6のDate型が内部的に倍精度浮動小数点型でデータを保持しているのに対して、VB.NETのDate型はクラス・ライブラリのDateTimeクラスによって実現していることから発生したものである。DateTimeクラスは、日付と時刻の双方を保持する機能を持つため、そのまま表示させると日付と時刻の双方を表示する。」となっていましたが、これは誤りでした。お詫びして訂正させていただきます。

「プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間