次の方法で共有


■ すべてがオブジェクト型

  • 基本データ型 (Integer、String) → オブジェクト型
  • Variant → Object

変更ポイント

Visual Basic .NET では、Integer や String など、基本データを含むすべての変数がオブジェクトになりました。また、汎用データ型は、Variant ではなく、Object を使用し、型を指定しない変数のデータ型も Object となります。

たとえば以下のように記述することにより、安全性や、他の .NET 言語との互換性が高まるだけでなく、変数の持つ便利なメソッドやプロパティを利用することができます。

                  
Dim str1 As String, x As Integer
str1 = "ABCDEFG"
x = str1.Length     ' 文字列の長さを取得 (String オブジェクトの Length プロパティ) 

最初はこの変化に戸惑うこともあるかもしれませんが、使ってみるととても便利で、直感的なプログラムができる (しかも、安全に) ということに気づくでしょう。

基本データ型は、対応するデータ (オブジェクト) に変更されます。といってもデータ型名に変更のないものも多いので、見た目には変化がない場合がほとんどです。

[ Visual Basic 6.0 のコード]

                  
Dim str1 As String
Dim birthday As Date

[ Visual Basic .NET にアップグレード]

                  
Dim str1 As String
Dim birthday As Date

しかし、実際のデータ型は変更しています。

また、Visual Basic .NET では通貨型 (Currency) はなくなりますが、代わりに大きな数値を扱うことができる Decimal を利用します。そのため、Visual Basic 6.0 の、

                  
Dim cur As Currency

は、

                  
Dim cur As Decimal

に変更されます。

もちろん、Variant や型指定なしの宣言は Object になります。

[ Visual Basic 6.0 のコード]

                  
Dim x As Variant
Dim y

[ Visual Basic .NET にアップグレード]

                  
Dim x As Object
Dim y As Object

整数型については、本章の 「Short、Integer、Long」 を参照してください。

今、何をしておくべきか?

必要に応じてアップグレードウィザードが変更を行なってくれるので、きちんと変数宣言をして整数を利用していれば問題はありません。変数を利用するとき (悪い意味で) テクニカルな使い方をしていると、Visual Basic .NET で変更が必要になります。たとえば、Boolean のデータを数値として利用したり、Visual Basic 6.0 の Date 型の内部構造が Double 型である (PlusOne 参照) ことを利用 (悪用?) したり、といった使い方です。

関連・補足項目

共通型システム (CTS:Common Type System)

.NET Framework では、すべての言語間で共通の型システムを使用します。ここで扱うデータは、基本データ型も含め、すべてオブジェクトです。共通型システムを利用することで、言語間の型の問題が解決され、相互に利用しやすくなります。

値型と参照型

「すべてオブジェクト」 といいましたが、実はデータは値型 (オブジェクト自身) か参照型 (オブジェクトへの参照) のいずれかに分類できます。値型に分類されるのは、基本データ型 (ただし、String と Object を除く) と列挙型と構造体 (ユーザー定義型) です。それ以外は参照型です。

                  
Dim x, y As Integer
x = 10
y = x

上のコードでは、y に 10 という値が代入されています。この後、x や y を変更しても互いに影響は与えません。

それは、x と y が値型だからです。

一方、次のプログラムでは、objStudentX と objStudentY が A で作成した同一のオブジェクトを参照します。

                  
Dim objStudentX, objStudentY As clsStudent
objStudentX = New clsStudent() ----------------------- A
objStudentY = objStudentX

そのため、一方の変更が他の参照に影響を与えます。

つまり、次のコードでは、「Akiko」 が表示されます。

                  
objStudentX.FName = "Akiko"
MsgBox(objStudentY.FName)

これが参照型の特徴です。

また、値型と参照型は初期化にも違いがあります。値型の場合は、変数宣言時にオブジェクトが作成されます。一方、参照型では変数が宣言されただけでは無効な状態 (Null が設定されている状態) になっています。New キーワードでオブジェクトを生成し、それを代入することではじめて参照がセットされます。

Plus OneDate 型

Visual Basic 6.0 では Date 型の内部は Double 型でした。そのため、日付の格納と操作に Double データ型を使用することができました。

Visual Basic .NET では、日付は内部的に Double としては格納されないため、そのような使い方をしていると修正が必要になります。

たとえば、次のコードは Visual Basic 6.0 では有効ですが、Visual Basic .NET でそのまま利用するとコンパイルエラーになります。

                    
Dim dbl As Double
Dim dat As Date
dat = Now
dbl = dat' Double型の変数に Date 型の値を代入
dbl = DateAdd("d", 1, dbl)' Double 型データを日付関数で使用
dat = CDate(dbl)' Date による Double 型データの Date 型への変換

.NET Framework には、Double と Date の間で変換を行なうための ToOADate および FromOADate 関数があるので、これを利用して型変換を行なうことも可能です。ちなみに、上記のコードはアップグレードウィザードによって次のように変換されます。

                    
Dim dbl As Double
Dim dat As Date
dat = Now
dbl = dat.ToOADate 
dbl = DateAdd(Microsoft.VisualBasic.DateInterval.Day, 1, System.Date.FromOADate(dbl)).ToOADate
dat = System.Date.FromOADate(dbl)

今回の場合は、幸運にも適切にアップグレードされましたが、常にプログラムの意図が正しく解釈されるとは限りません。

Visual Basic .NET での不必要な変更を避けるために、日付の格納には必ず Date 型を使用するようにして、操作の際に Double 型として扱うのは避けてください。