Visual Basic 初級講座 [改訂版]
VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第3回 型

2020/1/25

この記事が対象とする製品・バージョン

VB2019 Visual Basic 2019 対象です。
VB2017 Visual Basic 2017 対象です。
VB2015 Visual Basic 2015 対象です。
VB2013 Visual Basic 2013 対象です。
VB2012 Visual Basic 2012 対象です。
VB2010 Visual Basic 2010 対象です。
VB2008 Visual Basic 2008 対象です。
VB2005 Visual Basic 2005 対象です。
VB.NET 2003 Visual Basic.NET 2003 対象外ですがほとんどの説明があてはまるので参考になります。
VB.NET 2002 Visual Basic.NET (2002) 対象外ですがほとんどの説明があてはまるので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

 

目次

1.型

 

1-1.Visual Basicの型システムの特徴

「型」(かた)は値の種類を示しています。文字列なのか数値なのかという区別ですが、ほとんどの型はもっと複雑です。

Visual Basicでは数千から数万の型を使用できるほか、自分で型を作ったり、他の人が作った型を利用することもできます。

 

Visual Basicは非常に強力な型システム(型の仕組み)を持っており、次の特徴があります。

特徴1.すべての値になにかしらの型が必ずあります。

特徴2.プログラム中のどの値がどの型であるかはプログラムを実行する前にすでに決定しています。

この特徴を「静的型付け」(せいてきかたつけ)と呼びます。

コンパイル時点で型が不明確な値があればエラーとなり、コンパイルできません。

特徴3.型によって可能な操作が決まっています。

この特徴を「タイプセーフ」または「型安全」「強い型付け」などと呼びます。

たとえば、数値型同士はたし算・ひき算・かけ算・わり算という計算ができますが、文字列型ではひき算・かけ算・わり算はできません。

Visual Basicはタイプセーフな言語なので、このようなエラーがあるとプログラムを実行しなくてもプログラム中にエラーを指摘してくれます。

ただし、Visual Basicは親しみやすい言語なので、自動的に修正可能なエラーを修正して実行してくれる機能(Option Strict On)があります。この機能はプログラマーの好みでオン・オフできます。詳細は別途説明します。

特徴4.型は別の型を継承します。すべての型はObject型を継承しています。

この特徴は難しいので別途説明します。

 

1-2.型がもつ操作(メソッド)

型は文字列や数値と言ったデータの種類を決めるだけではなく、操作(メソッド)を持っています。

型データと操作を持つ

操作とは何らかの処理のことです。最初はピンと来ないかもしれませんが、数値や文字列と言った単純な型でも、単なるデータの入れ物ではなく操作して何かの処理をさせることが可能です。

どのような処理が可能であるかは型ごとに決まっています。

たとえば、文字列型には、その中に含んでいる英語の小文字をすべて英語の大文字に置き換えた文字列を生成する ToUpper (読み方:ToUpper = トゥーアッパー)と呼ばれる処理(メソッド)を持っています。

この処理は次のようにして呼び出せます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim st1 As String
st1 = "Hello! こんにちは!"

Dim st2 As String
st2 = st1.ToUpper()

'「HELLO! こんにちは!」と表示されます。
MsgBox(st2)

 

数値型には ToUpper という処理は定義されていないので、エラーになります。これが、型によってその型が持つ操作が決定するという意味です。

型が持つ処理(メソッド)の呼び出しについては別の回に詳しく説明します。

 

このように型には操作が定義されているので、ほとんどの型では文字列だとか数値だとかのデータの内容よりも、どんな処理を持っているかの方が重要です。

 

1-3.基本型と複合型

文字列や数値のような基本的な型はVBで定義されており「基本型」または「基本データ型」、「プリミティブ型」などと呼ばれます。それに対して、後で説明する複合型のほとんどはVBではなく、.NET Frameworkや.NET Coreなどのフレームワークで定義されており、VB自身の機能ではありません。

下記はVBで定義されているすべての基本型です。値の範囲の詳細などは データ型 にまとめてあります。

読み方(一例) 日本語 データの範囲
Boolean ブーリアン 論理型 True または False
Byte バイト バイト型 0 ~ 255
Char キャラ 文字型 1文字
Date デイト 日付型 0001年1月1日 0:00:00 ~ 9999年12月31 日 23:59:59
Decimal デシマル 十進型 29桁程度の整数・小数
Double ダブル 倍精度浮動小数点型 309桁程度の整数・小数
Integer インテジャー 整数型 -2147483648 ~ 2147483647
Long ロング 長整数型 -9223372036854775808 ~ 9223372036854775807
Object オブジェクト オブジェクト型 (任意の型を格納できます)
SByte エスバイト 符号付きバイト型 -128 ~ 127
Short ショート 短整数型 -32768 ~ 32767
Single シングル 単精度浮動小数点型 39桁程度の整数・小数
String ストリング 文字列型 0 個 ~ 約 20 億個の文字 (Unicode)
UInteger ユーインテジャー 符号なし整数型 0 ~ 4294967295
ULong ユーロング 符号なし長整数型 0 ~ 18446744073709551615
UShort ユーショート 符号なし短整数型 0 ~ 65535

※このほかにプログラムーが自分で複合型を作る土台として用意されているユーザー定義型を基本型に含めて説明している資料もあります。

数値にはいろいろな種類があるのですが、よくわからないうちは整数だけよいならIntegerを、巨大な数や小数も必要ならDecimalを使ってください。この2つは常に最良というわけではありませんが、だいたいの場合最良であり、何よりあなたが予想したとおりに動作してくれます。(他の数値型、たとえばSingleは初心者が予想した通りには動作しないかもしれません。)

 

基本型は根本的な型です。

この表ではデータの範囲に注目していますが、さきほど説明したようにそれぞれの型には操作(メソッド)も定義されています。

VBやフレームワークで定義されている型は総数数千、ひょっとすると数万あるかもしれませんが、データについてはすべてこの基本型の組み合わせで定義されています。これを「複合型」や「複合データ型」などと呼びます。

たとえば、フレームワークで定義されている Point型はX座標とY座標を表す2つのInteger型の組み合わせた複合型です。

操作(メソッド)についてはそれぞれの型でそれぞれ独自のプログラムによりさまざまな処理が定義されています。

 

プログラマーは独自の型を開発することができますが、基本型を作ることはできません。

基本型と似たように振舞う型、たとえば、値の範囲が1~10である数値型を作ることはできますが、そうだとしても内部では、この表にある基本型のどれかを利用してデータを格納しておく必要があるのです。

 

1-4.変数・定数に型を指定する

変数・定数に型を指定するには、前回説明したように宣言時に As を使用するのが一般的です。

前回も紹介した例を再掲します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim userName As String
Dim count As Integer
Dim ticks As Long
Dim totalAmount As Decimal
Dim average As Single
Dim surface As Double
Dim duedate As Date
Dim isInRange As Boolean

いくつかの型では As を使用しないで特別な記号を使って型を指定することもできます。

たとえば、宣言時に変数名の後ろに $ をつけると 文字列型になります。

次の例は文字列型の変数を宣言して値を代入しています。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim companyName$

companyName = "Visual Basic 中学校"

このような特別な文字はわかりにくいので2020年1月現在ではまず使用されていません。みなさんも使用しないことをお勧めしますが、他の人が書いたプログラムで使われているかもしれないので知識としては知っておいたほうが良いでしょう。どのような記号でどのような型になるかは下記の通りです。

記号
Integer %
Long &
Decimal @
Single !
Double #
String $

 

宣言と同時に初期値を指定する場合は、型を明示的に記述しなくてもVisual Basicが型を決めてくれます。これを「型推論」(かたすいろん)と呼びます。この機能はVB2008以上で使用できます。

たとえば、"ABC" を代入している変数は文字列型しかありえないので、As Stringを省略しても文字列型になります。

VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


'Dim st As String = "ABC" と同じ意味になります。

Dim st = "ABC"

数値の場合はIntegerやLongなどさまざまな数値型がある中から、Visual Basicが文字通り適切な型を推論して適用します。Visual Basicに推論させないで自分で明確に型を指定したい場合はAs Integer, As Longなどを自分で記述します。

VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'i は Integer と推論されます。
Dim i = 1

'j は Integer と推論されます。
Dim j = 123456789

'k は Long と推論されます。
Dim k = 1234567890123

'x は Double と推論されます。
Dim x = 123.456

変数の型は宣言時に決定するため、宣言時に値を代入しない場合は型推論が行われません。

次の例では変数 st は 文字列型(String)になりません。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'st は Object型 になります。
Dim st
st = "ABC"

デフォルト状態(Option Strict Off)のとき、この例では st は Object型 になります。Object型はどのような値でも格納できる型です。

型を明示することを要求するオプション Option Strict Onの場合、型が判断できないという理由でこの例はエラーになります。

 

発展 発展学習  -  型推論はローカル変数でのみ使用できます。

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

クラスレベルの変数では型推論を行うことができません。Asを付けて型を明示してください。

 

1-5.リテラルに型を指定する

VBではすべての値に型があるので、リテラルにも当然型があります。

リテラルに型を明示する場合、型ごとに決まっている「型文字」を末尾につけます。

下記に型文字を示します。型文字が空欄の型は型文字がない型です。

型文字
Boolean  
Byte  
Char c
Date  
Decimal D
Double R
Integer I
Long L
Object  
SByte  
Short S
Single F
String  
UInteger UI
ULong UL
UShort US

文字型(Char)の場合、単に " で囲むと文字列型(String)と区別が付かないため、区別が必要な場合は " "c というように末尾に c を付けて明示します。

次の、変数 c は代入する値が文字型であることが型文字により明示されているので、型推論機能により変数も文字型になります。c がなければ文字列型になります。

 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim c = "日"c

ただ、このように書くとわかりにくいので、次のようにAs Charを明示的に記述するのがお勧めです。

 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim c As Char = "日"c

 

十進型(Decimal)の変数 bigNumber への下記の値の代入はエラーになります。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim bigNumber As Decimal

'ここで オーバーフローのエラーが発生します。
bigNumber = 12345678901234567890123456789

十進型はこのような巨大な数を受け入れることができるのですが、数字で記述されたリテラル自体が整数型(Integer)と解釈されるためです。整数型(Integer)はこのような巨大な数を表現することができません。

この場合、型文字 D を使って右辺のリテラルが十進型であることを明示すればエラーにならずに代入できます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim bigNumber As Decimal
bigNumber = 12345678901234567890123456789D

 

1-6.練習問題

問1.Dim i = 123 で、 変数 i の型は何でしょうか?
短整数型(Short)
整数型(Integer)
長数型(Long)
十進型(Decimal)
問2.Const i = 123D で、定数 i の型は何でしょうか?
短整数型(Short)
整数型(Integer)
長数型(Long)
十進型(Decimal)
問3.Dim x$ で、変数 x の型は何でしょうか?
文字列型(String)
十進型(Decimal)
倍精度浮動小数点型(Double)
日付型(Date)

2.基本型

2-1.文字型と文字列型 (Char, String)

文字型(Char) 普通は使いません。
文字列型(String) よく使います。文字を扱うときは基本これです。

 

文字型(Char)と文字列型(String)はどちらもUnicode(ユニコード)で定義された文字を表現します。

文字型は1文字だけを表現し、文字列型は機能上は0文字から20億文字程度の文字を表現できます。20億文字というのは機能設計上の値なので性能上は20億文字代入するとメモリが足りなくなると思います。

文字列型(String)を使って1文字を表すこともできるので、文字型(Char)の出番はほとんどありません。

 

Unicodeは古今東西世界中の文字をコンピューターで扱えるようにするための共通規格です。

Unicodeのすべての文字にはコードポイントと呼ばれる番号が割り当てられています。このコードポイントをそのまま文字として扱うエンコード方式であるUTF-16でVBの文字・文字列はメモリ上に保存されています。

VBが内部でUnicodeで文字を保存しているとしても、これはShift-JISやEUCJPなどでエンコードされているファイルを読み書きできないという意味ではありません。読み取った結果VBの文字型または文字列型の変数に記録するときにはUnicodeのコードポイントとして記録されるという意味です。

改行の表現方法など文字列の表現方法については入門講座も説明していますので合わせて参照してください。

入門講座第6回 文字・数値・日付のあつかい

発展 発展学習  -  Unicodeのコードポイントと文字は1対1ではありません。

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

Unicodeは何度か大きく拡張されており、当初は1コードポイントが1文字を表していたのですが、あるとき複数のコードポイントの連続で1文字を表すという仕様が追加されました。2つのコードポイントで1文字を表す「サロゲートペア」や、濁点や半濁点のような元の字にとりつけるような記号を合成できる「合字」、同じ漢字なんだけどちょっと書き方違う、たとえば「渡辺」と「渡邊」の「辺」と「邊」の違いを表現する「異字体セレクタ」などです。このため、VBが認識する文字数と人間が認識する文字数は一致しない場合があります。

2-2.整数型 (Short, Integer, Long)

短整数型(Short) 普通は使いません。
整数型(Integer) よく使います。数値は基本的にこれを使います。32ビットCPUで計算速度が最速です。
長整数型(Long) よく使います。

 

短整数型(Short)、整数型(Integer)、長整数型(Long)は値の範囲が異なる以外は同じ仕様です。小数は扱えません。

既定(Option Strict Off)では小数を代入しようとすると偶数丸めと呼ばれる四捨五入に似た処理が行われて整数になります。

業務システムを扱うプログラマーは自動的に値が変わってしまうことに気がつかずバグの原因になってしまうリスクを考慮して、Option Strict Onを指定してこのケースをエラーにすることがほとんどです。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'Option Strict Off(既定値)の場合、i は 4 になります。
'Option Strict Onの場合、エラーです。
Dim i As Integer = 7 / 2

 

メモ メモ  -  偶数丸め
銀行丸めとも呼びます。四捨五入との違いは1.5, 2.5, 3.5 などちょうど整数と次の整数の中間地点にある値の処理の方法で、この場合、偶数になるほうに丸められます。たとえば、1.5は2になりますが、2.5は3ではなく2になります。(偶数の方によります。)
この処理の利点は大量の丸め処理を行った後で合計を計算したときに、丸め処理を行う前の合計値との差が四捨五入より小さくなることです。

たとえば、次の5つの数字の合計を処理前と四捨五入後と偶数丸め後で比較してみましょう。偶数丸めのほうが元の数字の合計に近いのがわかります。
プログラムの世界で単に「丸め」というと四捨五入ではなくこの偶数丸めを指すことが多いです。
  元の数字 四捨五入 偶数丸め
  1.1 1 1
1.5 2 2
1.6 2 2
1.7 2 2
2.4 2 2
2.5 3 2
合計 10.8 12 11

 

短整数型(Short)、整数型(Integer)、長整数型(Long)はそれぞれ、16ビット、32ビット、64ビットの範囲で値を格納します。メモリの消費量を少なくしたい場合短整数型(Short)が優秀ですが、この程度のメモリの節約は2020年現在ではほとんど意味がなく、短整数型(Short)を使用する機会は過去のバージョンのVBの移植などでない限りまずありません。

整数型は算術計算がもっとも高速なので通常の計算には整数型を使うべきです。特に32ビットのかたまりを扱う整数型(Integer)は32ビットCPUとの相性が最良で、処理速度が最速になります。

そうすると、64ビットのかたまりを扱う長整数型(Long)は64ビットCPUの場合、最速になるように思えますが、必ずしもそうではありません。64ビット環境の演算処理は各種最適化がされており、たとえば、64ビットCPUには32ビットの値を1回の計算で2個計算するという技があるそうです。私はこのあたりは詳しくないので、解説できませんが、おそくらLongの方が速い場合があり、今後(この記事を書いているのは2020年1月)、Longの方が速い環境が増えてくるのだと思います。

整数型(Integer)と長整数型(Long)の計算速度に差があるとしても微々たる物なので、よほど計算速度が重要な場合以外は無視してよいでしょう。プログラムが遅くなる原因はデータの計算速度よりも、ストレージの読み書きや、デバイスの待ち、ネットワーク通信、リソースの不足などがほとんどです。

 

2-3.符号なし整数型 (UShort, UInteger, ULong)

符号なし短整数型(UShort) 普通は使いません。
符号なし整数型(UInteger) 普通は使いません。
符号なし長整数型(ULong) 普通は使いません。

符号なし整数型は通常の整数型と同じビット数ですが、マイナスの値を取らない分、プラス方向に2倍大きな数値を格納できる型です。

 

もともとこれらの型は基本型ではなかったのですが、VB2005の時点で一応基本型に組み込まれました。

しかし、.NETの共通のルールを定める共通言語仕様では定義されていない型のため、これを使ったプログラムを行うと、.NETの他の機能との連携がやりにくくなる場合があります。特に必要がなければ使うべきではありません。

 

2-4.十進型 (Decimal)

十進型(Decimal) 小数が必要な場合、使用します。

 

十進型は長整数型(Long)以上に桁数が多く、小数も扱えることから整数型で不十分な場合の第一の選択肢になる型です。

VB以外のプログラミング言語も含んで一般化すると「固定小数点型」・「通貨型」などと呼ばれることもあります。

 

コンピューターと小数とは相性が悪く、これまでの人類の歴史の中で大量のバグを生んできました。

1991年湾岸戦争のときに、アメリカ軍のパトリオットミサイルがイラク軍のスカッドミサイルの撃墜に失敗したのは、小数の計算のバグということです。

参考:失敗百選 ~パトリオットミサイルの防御失敗~

(パトリオットミサイルのOSの起動時間の処理にも小数の問題があり、定期的にミサイルのOSを再起動する必要があったという話しも聞いたことがあります。)

また、1996年にアリアンロケットが爆発したのは制御プログラムに小数のバグがあったからだと言われています。

参考:失敗知識データベース

私の知り合いはリリースしたシステムの消費税計算にバグがあり、ときどき金額が狂ってしまうことに後で気がついたということです。この程度のバグならおそらくプロのプログラマーに聞けば1つや2つはすぐに出てくるのではないかと思います。

 

こういったバグのほとんどは小数を「浮動小数点型」(ふどうしょうすうてんがた)という仕組みで扱っていることが原因です(すべての原因がこれだというわけではありません)。

十進型は計算速度を犠牲にして、これらの問題点を改善した型です。

十進型は考え方としては整数型と同じで、ただ、整数型にプラスアルファして小数点がどこにあるかという情報をもっているという仕組みになっています。

そのため、計算は安心安全な整数の計算と同じです。ただ、計算の都度小数の位置をずらす必要があるため、速度はかなり犠牲になっているらしく、数値型の中ではもっとも計算速度が遅いようです。

 

2-5.浮動小数点型 (Single, Double)

単精度浮動小数点型(Single) 普通は使いません。
倍精度浮動小数点型(Double) 小数が必要で、十進型(Decimal)だと遅すぎる場合に使います。(金額の計算には使用しないでください!)

 

浮動小数点型がどういう仕組みで数値を扱っているかはいろいろなところに説明があるので、解説は割愛します。

たとえば、Wikipediaに詳しく書いてあります。

浮動小数点型

 

浮動小数点型は、値の正確さよりも計算速度を重視するときに使用する型で、計算の結果に浮動小数点型に特有の誤差を含みます。

ちょっとやそっとの誤差なら気にならないという描画処理の色や座標を計算する場合は、速度優先の浮動小数点型が適していますが、1円1銭でも誤差が発生すると困るという金額や金融のプログラムには不適切です。

 

たとえば、浮動小数点型を使った次の計算は、予想外の結果になります。

このプログラムは 0.05 を 10回たしているだけなので、答えは 0.5 になることを期待しますが、0.5000001 と表示されます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim value As Single

'0.05を10回たす
value = 0.05F + 0.05F + 0.05F + 0.05F + 0.05F + 0.05F + 0.05F + 0.05F + 0.05F + 0.05F

'0.5000001と表示される
MsgBox(value)

なお、倍精度浮動小数点型(Double)でも同じ誤差が発生しますが、もっと細かい数字でたし算を行わないと再現しません。

 

十進型(Decimal)であればこの誤差は発生しません。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim value As Decimal

'0.05を10回たす
value = 0.05D + 0.05D + 0.05D + 0.05D + 0.05D + 0.05D + 0.05D + 0.05D + 0.05D + 0.05D

'0.50と表示される
MsgBox(value)

 

この誤差が発生する理屈と、これによってバグが発生しないようにする方法は結構小難しく、十進型のところで紹介したようにミサイルの迎撃に失敗したり、高価なロケットが爆発してしまうほどです。そのようなシステムを作っているプログラマーがどれだけ優秀であるか考えてみてください。そのような優秀なプログラマーがこれだけ重要なプログラムでもバグを埋め込んでしまっているのです。

将来、またロケットが爆発しても困るので、自信がない人は遅くても想定どおりの値になる十進型(Decimal)を使うことを私は強く推奨します。

 

2-6.バイト型 (Byte, SByte)

バイト型(Byte) バイナリデータを扱う場合に使用します。
符号付きバイト型(SByte) 使いません。

 

バイト型は数値にすると 0 ~ 255 を表していますが、算術計算を目的とした型ではありません。

コンピューターは究極的にはすべてのデータを 0 と 1 の集合で扱っており どんなデータでも2進数で表現できます。2進数だと、01100111010101100101・・・のようにぱっと見てもどこからどこまでがまとまりかわからないため、よく8個のまとまりで区切ります。この8個のまとまりのことを(2020年現在では)「バイト」と呼びます。8個のまとまりでは 00000000 ~ 11111111 までの範囲を扱うことができ、これを十進数で表現すると 0 ~ 255 となります。この単位でデータを扱うのがバイト型です。

このようにバイト型は文字列型や数値型よりもコンピューターの仕組みに近い考え方のため、扱いにくく、特に使う理由がないのであれば使わない型です。

しかし、コンピューターのデータをなんでも表現できるという利点があるため、まったく新しい機能を作ろうとしている場合やなど、他の仕組みが利用できないときにはバイト型を利用してプログラムしていくことがあります。

符号付きバイト型(SByte)はマイナス部分をなくしてその代わりのプラス部分をほぼ倍まで表現できるバイト型です。こちらは.NETの共通ルールで定義されていない型でもあり、使い道も思いつかないので多分使うことはないのではないかと思います。

 

 

2-7.日付型 (Date)

日付型(Date) 日付と時刻を扱う場合使用します。

 

日付型は西暦1年1月1日から西暦9999年12月31日までの間の日付と時刻を扱うことができる型です。名前が「日付型」ですが時刻も表現できます。

また、日付や時刻に関する便利な操作も多数持っています。

秒やミリ秒も扱うことができます。ミリ秒とは1秒の1000分の1を表しており、1000ミリ秒 = 1秒です。

内部では西暦1年1月1日からの経過時間を保持しています。この経過時間はTicks(ティックス)と呼び、100ナノ秒単位で表現されます。

 

西暦1年1月1日からの経過時間はどのような国・地域・時代であれ、共通なので、日付型が内部で保持している値は古今東西共通で使用できます。

 

人間向けにはこの内部で保持しているTicksの値を「年」「月」「日」「時」「分」「秒」などの単位に変換して表示します。

Ticksをこのような年月日時分秒に変換するときにはデフォルトでグレゴリオ暦を使用されるため、グレゴリオ暦以外の暦を扱いたいときは独自の変換を行う必要があります。フレームワークにそのような機能が用意されています。

グレゴリオ暦は現代の日本をはじめ多くの国で採用されている暦です。

日本では明治6年1月1日からグレゴリオ暦が採用されているので、これ以降の日付と時刻は日付型が表現するものと完全に一致します。西洋では1582年10月15日からグレゴリオ暦が採用されているためこれ以降の日付と時刻が日付型と一致します。

歴史の年表をあつかうようなプログラムの場合、古い日付はなんらかの工夫をしないとそのままの日付型では表現できないので注意してください。

発展 発展学習  -  古い日本の日付

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

江戸時代までの日本の日付は科学的法則に従っていません。基本的には中国などの太陰暦に従いつつも、たとえば、大の月(30日まである月)が4ヶ月連続すると不吉なので、4ヶ月目は29日で終わりにするというような人為的な操作を行っていたようです。

このためグレゴリオ暦との機械的な変換は不可能です。1対1の対応表を使って変換する必要があります。(だれかその対応表を送ってもらえれば私がVBの機能作りますよ。)

グレゴリオ暦以外が必要な場合は、グレゴリオ暦以外の暦を扱うための機能がフレームワークにありますので、そちらを使用することになります。そのときも基本は日付型(Date)で、それの変換方法を変えるという形になります。この機能により平成や令和という和暦も扱うことができます。対応している元号は明治・大正・昭和・平成・令和のみです。

 

期間を扱う型はVBにはなくフレームワークの TimeSpan型 (読み方:TimeSpan = タイムスパン)を使うことになります。期間とは日付に似ていますが、たとえば、あと45日と8時間でオリンピックだという場合の45日8時間は日付ではなく期間です。

 

2-8.論理型 (Boolean)

論理型(Boolean) よく使います。

論理型(Boolean)は、イエスかノーか、オンかオフか、有効か無効かのような2つの状態を表すのに使います。

そのため、とりうる値は特殊な値である True (読み方:True = トゥルー)か False (読み方:False = フォルス) のみで、Trueの方が、イエス、オン、有効といったOKな方の意味を表し、Falseの方が、ノー、オフ、無効というようなネガティブな意味を表します。

TrueとFalseは特殊な値であり、プログラム中に直接記述できます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim isOK As Boolean
isOK = True

Dim done As Boolean = False

'型推論によりbはBoolean型になります。(VB2008以降)
Dim b = True

 

論理型(Boolean)はプログラムの中でIf文(読み方:If = イフ)を使って条件判断をする場合に必ず登場します。If文については別途説明します。

 

VBでは値が等しいかどうか比較する演算子 = があり、この演算子の結果は等しいか、等しくないかという意味になるので 論理型(Boolean) です。

比較演算子の = と代入を実行する演算子の = は同じ = なので、ちょっと紛らわしいです。他の計算に使用する演算子と並べてみるとわかりやすいかもしれませんので、下記に + と = を使って値を計算する例をそれぞれ示します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim x As Integer = 2
Dim y As Integer = 3

Dim summary As Integer = x + y '5 になります。
Dim areSame As Boolean = x = y 'False になります。

Dim areSame As Boolean = x = y の中で、最初にでてくる = は、代入を行う = です。2番目にでてくる = は比較演算子の = です。

この例のような書き方をすることは非常にまれですが、このように書く場合は、少しでもわかりやすくするために ( ) を使って次のように書くのがよいです。意味はかわりません。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim areSame As Boolean = (x = y) 'False になります。

( ) は学校の算数・数学と同じ意味で、1つの式の中に複数の計算がある場合の計算順序を優先することを表します。この例では、計算が比較の = しかないので、( ) はあってもなくても結果は変わりません。このように見易さのために ( ) を使うということがプログラムではしばしば行われます。

 

Option Strict Offのとき、True・Falseの変わりに数値を使うこともできますが、わかりにくいのでお勧めしません。

0 は Falseを表し、それ以外の数はすべてTrueを表します。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim b1 As Boolean = 0 'False
Dim b2 As Boolean = 1 'True
Dim b3 As Boolean = 2 'True

 

2-9.オブジェクト型 (Object)

オブジェクト型(Object) ときどき使います。

オブジェクト型はどのような値でも代入できる型です。VBやC#など.NETに準拠している言語の型システムは、新しい型を作成するときにゼロから作成するのではなく、基となる型を決めてその型の機能を継承する形で作成することになっています。オブジェクト型はこの継承の仕組みの中で一番根本である根っこに位置し、すべての型はObject型を継承して作成されています。

どのような値でも代入できるという性質は一見便利そうですが、逆にさまざまな工夫をこらした特徴のある型の機能が使用できないことを意味にしており、通常、他の型で十分なところをオブジェクト型を使用するのは推奨されません。

オブジェクト型を使用するのは、どのような値を扱えばよいのか事前にわからない場合に限ります。

 

2-10.練習問題

問1.整数が必要なとき、最適な型は何でしょうか?
短整数型(Short)
整数型(Integer)
長数型(Long)
十進型(Decimal)
問2.小数が必要なとき、最適な型は何でしょうか?
単精度浮動小数点型(Single)
倍精度浮動小数点型(Double)
バイト型(Byte)
十進型(Decimal)
問3.文字を表現したいとき最適な型は何でしょうか?
文字型(Char)
文字列型(String)
バイト型(Byte)
オブジェクト型(Object)
問4.論理型がとりうる値は何でしょうか?
0 と 1
True か False
すべての値
バイナリーデータ

 

3.複合型

複合型は、基本型を0個以上組み合わせたデータを持つ型のことです。

フレームワークに数千の複合型が定義されています。自分で複合型を作ることもできます。

それぞれの複合型にはデータのほかに操作も定義されており、さまざまな機能が実装されています。

複合型は別の観点ではクラスや構造体・配列・タプルなどに分類されます。

これらの使用方法は別の回に詳しく説明します。