Visual Basic 図解 基礎解説 |
この記事が対象とする製品・バージョン
Visual Basic 2008 | ◎ | 対象です。 | Visual Basic.NET 2003 | ◎ | 対象です。 | |
Visual Basic 2005 | ◎ | 対象です。 | Visual Basic.NET (2002) | ◎ | 対象です。 | |
Visual Basic 6.0 | × | 対象外です。 |
概要・変数・定数・関数・クラスなどを宣言する場合に使用するPublic, Friend, Protected, Private, Dim, Static, Protected Friendの効果について説明します。 |
変数・定数・関数・クラスなど(以下これらを「プログラミング要素」と呼びます)、ほとんど(※1)の宣言は Public, Friend, Protected, Private, Dim, Static, Protected Friend, Sharedのどれかを用いて行います。宣言に用いるキーワードによって、以下の違いが発生します。
プログラミング要素の有効な範囲のことを「適用範囲」・「スコープ」などと呼びます。
※1、この他の宣言としてメソッドのパラメータ、Using、Catch、LINQ構文がある。
適用範囲を一覧表にすると次のようになります。
同じプロジェクト | 異なるプロジェクト | |||||
他クラス | 派生クラス | 同じクラス | 他クラス | 派生クラス | ||
Public | ○ | ○ | ○ | ○ | ○ | どこからでも参照できる |
Protected Friend | ○ | ○ | ○ | × | ○ | Protected + Friendの効果 |
Protected | × | ○ | ○ | × | ○ | 派生クラスから参照できる |
Friend | ○ | ○ | ○ | × | × | 同じプロジェクト内で参照できる |
Private | × | × | ○ | × | × | 自分からしか参照できない |
※Dim・Sharedについては「4.Dim・Sharedの効果」参照。
この表は一見複雑そうですが、図にすると次のようになります。
この図はクラスAで宣言したプログラミング要素が他のクラスからどのように見えるか示したものです。この図ではクラスA1、クラスA2はクラスAの派生クラスです。
たとえば、クラスBからはクラスAでPublicまたはFriendで宣言したプログラミング要素を参照することができます。
クラス(構造体)直下 | プロシージャ内 | |
Public, Friend, Protected, Protected Friend, Private | ○ | × |
Dim | △ | ○ |
Shared | ○ | × |
Static | × | ○ |
△は宣言は可能ですが使用することが推奨されていないことを示します。
クラス直下でのDim・Sharedのみによる変数・定数の宣言はPrivateの効果があります。構造体直下ではPublicの効果があります。紛らわしいのでプロシージャの外ではDimを使わないという主義の人々もいます。Sharedも単体で使用するのではなくPrivate SharedやPublic Sharedのように組み合わせて使用することが推奨されます。
なお、変数・定数におけるすべてのPrivate、Public、Protected、FriendはそれぞれPrivate Dim、Public Dim、Protected Dim、Friend Dimの略と考えるとこもできます。たとえばPublic Dim X As Integerと入力すると、自動的にPublic X As Integerに補正されます。
Public, Friend, Protected, Protected Friend, Private | クラスが適用範囲から抜けた時点で消滅します。 |
クラス(構造体)直下のDim | クラスが適用範囲から抜けた時点で消滅します。 |
プロシージャ内のDim | プロシージャから抜けた時点で消滅します。 |
ブロック内のDim | ブロックから抜けた時点で消滅します。 |
Shared | アプリケーションの実行が終了するまで消滅しません。 |
Static | クラスが適用範囲から抜けた時点で消滅します。 |
ブロックとはFor 〜 Next, Do 〜 Loop, If 〜 End Ifのようなブロック構造を指します。
※寿命が尽きてもすぐにメモリが解放されるわけではありません。メモリ解放のタイミングはガベージコレクタが自動的に管理しています。
適用範囲 | 寿命 | 宣言できる場所 | |
Public | すべて | クラスが消滅するまで | クラス直下 |
Protected Friend | プロジェクト内・派生クラス内 | クラスが消滅するまで | クラス直下 |
Protected | 派生クラス内 | クラスが消滅するまで | クラス直下 |
Friend | プロジェクト内 | クラスが消滅するまで | クラス直下 |
Private | 宣言したクラス内 | クラスが消滅するまで | クラス直下 |
クラス(構造体)直下のDim | 宣言したクラス内 | クラスが消滅するまで | クラス直下 |
プロシージャ内のDim | プロシージャ内 | プロシージャが実行されている間 | プロシージャ内 |
プロシージャ内のStatic | プロシージャ内 | クラスが消滅するまで | プロシージャ内 |
ブロック内のDim | ブロック内 | ブロックを実行されている間 | ブロック内 |
ブロック内のStatic | ブロック内 | クラスが消滅するまで | ブロック内 |
クラス直下のShared(単体) | 宣言したクラス内 | 不死 | クラス直下 |
構造体直下のShared(単体) | すべて | 不死 | 構造体直下 |
読み方 | 英語の意味 | |
Public | パブリック | みんなの |
Protected | プロテクテッド | 守られた |
Friend | フレンド | 友達 |
Private | プライベート | 個人の |
Dim | ディム | 次元 (Dimension) |
Static | スタティック | 変化しない |
Shared | シェアード | 共有された |