Visual Basic 初級講座 [改訂版]
 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第5回 クラスと名前空間

2020/2/15

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

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.フレームワークの呼び出し

.NETのフレームワークの機能は「クラス」または「構造体」(こうぞうたい)というものに実装されています。

 

下記はクラスを呼び出すことでフレームワークの機能を利用するいくつかの例です。

この例はプログラム中に記述されたパスが利用可能であればWindowsフォームアプリケーションに貼り付けることでそのまま実行できます。

VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'▼Webサイトから画像をダウンロードしてローカルファイルに保存します。
Dim Internet As Net.WebClient = New Net.WebClient()
Internet.DownloadFile("http://www.sangiin.go.jp/japanese/taiken/gijidou/images/01.jpg", "C:\Temp\Download.jpg")

'▼サウンド(wavファイル)を再生します。
Dim player As New Media.SoundPlayer("C:\Windows\Media\chord.wav")
player.Play()

'▼テキストファイルを作成します。
IO.File.WriteAllText("C:\temp\test.txt", "あいうえお!")

'▼メモ帳を起動して、作成したテキストファイルを開きます。
Process.Start("C:\Windows\notepad.exe", "C:\temp\test.txt")

この例の中で WebClient、SoundPlayer、File、Processがクラスです。クラスの機能を呼び出すことでファイルダウンロードやサウンド再生など目的の機能が実行しています。

 

ポイントは2つあります。

1つはそれぞれのクラスの使い方違う点です。画像のダウンロードとサウンドの再生ではNew(読み方:New = ニュー)を使ってから、クラスの機能を呼び出す必要があり、2行ずつ使っています。ファイルの作成とメモ帳の起動ではNewを使う必要がないので、たった1行でクラスの機能を呼び出しています。

もう1つは、クラスの実際の機能を呼び出す際にDownLoadFile、Play、WriteAllText、Startなどの命令を使用している点です。これらの命令は「メソッド」というもので、通常、クラスには複数のメソッドがあり、メソッドを使用してクラスが持っている機能を呼び出せます。

 

2.クラスと構造体

2-1.クラス

クラスはデータと操作をまとめたプログラムの単位で、Visual Basicのプログラムでの中心的な存在です。

クラスはメソッド・プロパティ・フィールド・コンストラクター・イベント・演算子というもの0個以上持っています。

これらをまとめてクラスの「メンバー」と呼びます。

主役はメソッドとプロパティです。メソッドは操作・処理を実行しを、プロパティはクラスのデータの読み書きを実行します。

 

メソッド 操作・処理を実行します。
プロパティ データを設定または取得します。
コンストラクター クラスのインスタンスを作ります。(インスタンスについては次回説明します。)
イベント クラスから通知を発信します。例:ButtonクラスのClickイベント。
フィールド クラスのデータを表します。
演算子 たし算やひき算などの計算をクラス独自に定義します。

 

クラスは関連する機能を集約してプログラマーに扱いやすいように設計されており、できるだけ現実世界の「物」のようなニュアンスで使えるようにモデル化もされています。

たとえば、SoundPlayerクラス(読み方:SoundPlayer = サウンドプレイヤー)はサウンドプレイヤー機能をモデル化していて、再生するためのPlayメソッドや停止するためのStopメソッドがあります。

また、対象のサウンドの場所をデータとして格納するSoundLocationプロパティ(読み方:SoundLocation = サウンドロケーション)もあります。

SoundPlayerクラスにはこの画像に掲載していないメソッドやプロパティもあります。

 

.NETのフレームワークには数千から数万のクラスまたは構造体が存在しています。

いくつか例をあげると次のようなクラス/構造体があります。

クラス/構造体 読み方 概要
Button クラス ボタン Windowsフォームでクリックできるボタンを表します。
Color 構造体 カラー 色を表します。
Environmentクラス エンバイロメント OSなどプログラムの実行環境を表します。
Mathクラス マス 一般的な数学の関数を提供します。
Randomクラス ランダム 簡易乱数機能を提供します。
SqlClientクラス エスキューエルクライアント SQL Server(マイクロソフトのデータベース製品)にアクセスする機能を提供します。
Matrix クラス マトリクス 3 x  3の数学上の行列を表します。座標変換用の機能を提供します。
Bitmap クラス ビットマップ 画像データを表します。
JapaneseCalendar クラス ジャパニーズカレンダー 和暦を表します。
Cookie クッキー ブラウザーなどで使用するクッキーを表します。

 

2-2.構造体

構造体は実質的には軽量版のクラスとでもいうべきもので、使う側からすると機能上の差異はほとんどありません。

先ほど説明したようにクラスにはデータ(プロパティ)と操作(メソッド)があります。構造体も同じです。

はじめに.NETを設計したマイクロソフトの技術者は、操作に着目していろいろなロジックや処理を実行するものがクラス、データに着目してデータを記録するデータ型のようなものが構造体、というような使い分けを想定したのではないかと思います。(これは私の想像です。)

クラスと構造体の違いがプログラムに影響する場合はもちろんありますが、当面は同じものだと考えて問題ありません。違いがある場合にその都度説明することとします。

 

3.名前空間

 

3-1.完全修飾名

クラスや構造体は名前空間(なまえくうかん)というカテゴリで分類されています。VBのプログラムでクラスを厳密に指定するには名前空間をつけて次のように書きます。


System.IO.File

この例ではFileがクラス名で System.IOが名前空間の名前です。

このようにすべての名前空間名 + クラス名 で記述された名称を完全修飾名(かんぜんしゅうしょくめい)と呼びます。

操作方法 クラス名は水色っぽい色で表示されます。

Visual Studioではクラス名(または構造体名)は水色っぽい色で表示されます。

クラス名(File)が水色っぽい色で表示されている

 

 

3-2.名前空間

名前空間はクラスや構造体を分類するためのカテゴリーです。名前空間自体には機能はありません。

名前空間の中に名前空間を所属させるような入れ子の構造も可能です。

Windowsのファイルがフォルダーによって分類されており、フォルダーの中にフォルダーを作れるのと同じようなイメージです。

.NETのフレームワークの主要な機能はすべての System名前空間に属しています。

.NETのフレームワークの主な名前空間には次のものがあります。

名前空間
System.Collections 値の集合を扱う機能を提供します。
System.Data データベースにアクセスする機能を提供します。
System.Drawing Windowsでのグラフィックス機能を提供します。
System.IO ファイルシステムの読み込み・書き込み等の機能を提供します。
System.Net ネットワーク機能を提供します。
System.Text テキスト処理機能を提供します。
System.Web Webアプリケーション作成用の機能を提供します。
System.Windows.Forms Windowsフォームアプリケーション作成用の機能を提供します。

このほかにもたくさんあります。

 

下記サイトでは.NET Framework 4.8 の名前空間の一覧が見られます。どれだけたくさんの名前空間があるかわかるでしょう。

https://docs.microsoft.com/ja-jp/dotnet/api/?view=netframework-4.8

 

3-3.名前空間の省略

クラスのメンバーのうち単純なものは後ろに . (ドット)でつなげてメンバー名を記述し、( )内に追加情報を指定するだけで呼び出せます。詳細は次回改めて説明します。


System.IO.File.WriteAllText("C:\temp\test.txt", "あいうえお!")

 

プログラム内でクラスを記述する場合に、完全修飾名を使えば完璧ですが、記述を省略できる名前空間もあります。

Visual Studioでプロジェクトのプロパティから参照設定タブのなかに、「インポートされた名前空間」という項目があります。

ここでチェックが入っている名前空間はプログラム内で省略可能です。

System名前空間には既定でチェックが入っているため省略することができます。

そのためFileクラスのWriteAllTextメソッドは次のように呼び出すこともできます。

 


IO.File.WriteAllText("C:\temp\test.txt", "あいうえお!")

 

操作方法 操作 - 省略可能なキーワードはグレーで表示されます。

Visual Studioでは省略可能なキーワードはグレーで表示されます。

省略可能なキーワード(System)がグレーで表示されている。

 

 

また、プログラムファイルの先頭にImports 名前空間 (読み方:Imports = インポーツ) と記述すると、そのファイル内ではその名前空間は省略可能になります。

たとえば、Imports System.IO と記述すると、Fileクラスは、単に File と書くだけで呼び出せます。

 


File.WriteAllText("C:\temp\test.txt", "あいうえお!")

 

Importsを利用したプログラム例は下記の通りです。

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

Imports System.IO

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        File.WriteAllText("C:\temp\test.txt", "あいうえお!")

    End Sub
End Class

 

まとめると、クラスを指定するには、完全修飾名を使う方法と、プロジェクトの設定されている(=インポートされた名前空間の設定でチェックされている)名前空間を省略する方法と、Imports句で指定した名前空間を省略する方法の3つがあります。

プロジェクトの設定はプロジェクト全体で有効ですが、ここに設定があることに気がつかないことが多いので、あまり使わない方が良いように思います。

 

 なお、 必要な名前空間を省略してエラーになる場合、Visual Studioが修正方法を提案してくれます。

Fileのエラーの修正をVisual Studioが提案してくれている

Visual Studioが提案してくれるないようなバージョンがあがるごとに賢くなっています。この画像はVisual Studio 2019のものです。

Visual Studioは6種類の修正を提案をしています。

一番上にある、「Import System.IO」または3番目にある「完全修飾 'File' 」から「IO.File」を選択するのがこの場合は正解です。

 

Visual Studioは可能性のありそうな名前空間を検索してあてはままるクラスがあるかどうか調べて提案してくれるようですが、すべての名前空間を検索してくれるわけではありません。Visual Studioが名前空間を提案してくれない場合でも、自分で名前空間を補うことで修正可能な場合もあります。

3-4.シャドウィング

名前がなにかとバッティングする場合は、完全修飾名での記述が必要な場合もあります。

たとえば、Windowsフォームアプリケーションでフォームにプログラムしている場合、単に Text と書くと フォームの Textプロパティを意味します。

一方、System.Textという名前空間がありますが、Systemを省略すると Text となってしまい、Textプロパティとバッティングするため、System.Textと書く必要があります。

このように同じ名前がバッティングして、片方が優先される現象をシャドウィングと呼びます。シャドウィングが発生する場合、身近なほうが優先されます。

フォームにとっては自分のTextプロパティは身近なので、どこか遠くにあるSystem.Text名前空間よりも優先されるというわけです。

 

4.型とクラス

 

StringやIntegerなどの型の機能もSystem名前空間に所属しているクラスや構造体に実装されています。

VBの型 対応するフレームワークのクラス・構造体 参考:C# の型
Boolean System.Boolean 構造体 bool
Byte System.Byte 構造体 byte
Char System.Char 構造体 char
Date System.DateTime 構造体 (該当なし)
Decimal System.Decimal 構造体 decimal
Double System.Double 構造体 double
Integer System.Int32 構造体 int
Long System.Int64 構造体 long
Object System.Object クラス object
SByte System.SByte 構造体 sbyte
Short System.Int16 構造体 short
Single System.Single 構造体 float
String System.String クラス string
UInteger System.UInt32 構造体 uint
ULong System.UInt64 構造体 ulong
UShort System.UInt16 構造体 ushort

この表にあるVBの型と対応するフレームワークのクラス・構造体はまったく同じ実体です。参考に記述したC#の型ともまったく同じです。

VBとC#は.NETのフレームワークを利用する前提で設計されているので、名前は違えども、それぞれの型が完全に一致するように設計されているのです。

 

VBでAs Integer と記述するすべての場所を As System.Int32 と書いても完全に機能します。

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

Dim i As System.Int32
i = 123 + 5
MsgBox(i)

この例の場合、Visual Studio 2019は System.Int32 と Integer に書き換えるという提案をしてきます。

Visual StudioがInt32をIntegerに修正するように提案している

しかも、この提案をプロジェクト全体に適用するというオプションも提供されており、すべての「System.Int32」を「Integer」に置き換えられることを示しています。

 

「型」と「クラス」は実体は同じものであり、話をするときの文脈で言葉を使い分けているだけです。

数値だとか文字だとか、データに着目するときは「型」と呼びます。そうではなく、その持っている機能に注目するときは「クラス」と呼びます。

特に別途説明する予定の「オブジェクト指向」というクラスの考え方に基づいて会話や説明をするときは「クラス」と呼ぶ傾向が顕著になります。

メモ メモ  -  これは私の持論です。
でも、多分正しいですよ。この使い分けで理解しておけば困ることはないはずです。プログラム言語によっては当てはまらないものもあります。VB・C#には当てはまります。

 

いくつか例文を挙げます。

VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'▼サウンド(wavファイル)を再生します。
Dim player As New Media.SoundPlayer("C:\Windows\Media\chord.wav")
player.Play()

・変数 player は SoundPlayer型 です。

・Playメソッドは SoundPlayerクラスのメソッドです。

・変数 player は SoundPlayerクラスのインスタンスです。 ※まだ「インスタンス」を説明していませんが参考に例文として載せます。

・SoundePlayerクラスはMedia名前空間に属しています。

 

 

5.リファレンス

どんな名前空間があって、どんなクラスがあって、どんなメソッドを持っているか調べるにはMicrosoft DocsのWebサイトで公開されている .NET APIブラウザーを使用します。

.NET Core 3.1 の場合

https://docs.microsoft.com/ja-jp/dotnet/api/?view=netcore-3.1

.NET Framework 4.8 の場合

https://docs.microsoft.com/ja-jp/dotnet/api/?view=netframework-4.8

 

Webサイトなのでデザインや内容は随時変更されていくと思いますが、2020年1月時点のサイトを使って説明します。

対象のフレームワークは画面上部で切り替えられます。

この一覧には製品やサービスに固有のフレームワークも表示されます。VBで通常使用するのは「.NET Core」または「.NET Framework」ですので、それ以外は知識がない場合は選択しないのが良いと思います。

 

ここでフレームワークを選択すると、そのフレームワークに属する名前空間の一覧がでてきます。

ここには入れ子になっている名前空間も含めて全名前空間が表示され、名前空間の説明も表示されますので、自分がやりたいことに近い説明の名前空間を探してみてください。

名前空間をクリックすると、その名前空間に属していて使用可能な全クラスと全構造体の一覧が表示されます。

たとえば、System.IO名前空間をクリックすると次のようになっています。

左側には目次としてクラスの一覧が並んでいます。目次または右側のクラスに一覧からどれかクラスを選ぶとそのクラスの詳しい説明が表示されます。

プログラム例も載っている場合があります。

この中にメンバーの一覧もあります。

 

リファレンスはレストランのメニューのようなものです。

自分が欲しいものを選ぶリストなのです。この大量のリファレンスの中からあなたがやりたいことを探してみてください。

呼び出し方さえ知っていれば、欲しいものを選んで、プログラムから呼び出すだけです。

このような機能を組み合わせてまったくオリジナルな機能をもつソフトウェアに仕立て上げたり、便利な機能を自動化するプログラムを作ったりしていくことができます。

既存の機能の一覧を組み合わせてオリジナルな機能ができあがるというのは妙に思うかもしれませんが本当です。数学者がたし算やひき算からはじまって、因数分解や二次関数をあみ出し、微分積分をあみ出し、新しい数学理論をあみ出すのに少し似ているかもしれません。

 

6.練習問題

 

問題1.次の中からクラス名をすべて選択してください。

'▼Webサイトから画像をダウンロードしてローカルファイルに保存します。
Dim Internet As Net.WebClient = New Net.WebClient()
Internet.DownloadFile("http://www.sangiin.go.jp/japanese/taiken/gijidou/images/01.jpg", "C:\Temp\Download.jpg")

'▼サウンド(wavファイル)を再生します。
Dim player As New Media.SoundPlayer("C:\Windows\Media\chord.wav")
player.Play()

'▼テキストファイルを作成します。
IO.File.WriteAllText("C:\temp\test.txt", "あいうえお!")

'▼メモ帳を起動して、作成したテキストファイルを開きます。
Process.Start("C:\Windows\notepad.exe", "C:\temp\test.txt")

 

問題2.次の中から名前空間をすべて選択してください。

'▼Webサイトから画像をダウンロードしてローカルファイルに保存します。
Dim Internet As Net.WebClient = New Net.WebClient()
Internet.DownloadFile("http://www.sangiin.go.jp/japanese/taiken/gijidou/images/01.jpg", "C:\Temp\Download.jpg")

'▼サウンド(wavファイル)を再生します。
Dim player As New Media.SoundPlayer("C:\Windows\Media\chord.wav")
player.Play()

'▼テキストファイルを作成します。
IO.File.WriteAllText("C:\temp\test.txt", "あいうえお!")

'▼メモ帳を起動して、作成したテキストファイルを開きます。
Process.Start("C:\Windows\notepad.exe", "C:\temp\test.txt")