.NET VB 変数・定数・スコープ(有効範囲)
.NET VB(VisualBasic)の変数・定数の宣言や使用方法、スコープ(有効範囲)や値型・参照型について解説風に記録しておく。変数やプロシージャ名のネーミング(名付け)に困ったときの対策方法についても記載。
変数
プログラム内で使用するデータを一時的に格納したり、値の受け渡しに使用します。また、変数を定義し値を代入するとメモリ上に領域を確保して保存されます。
宣言方法
変数を使用するには、まず変数名とデータ型から構成される宣言という行為を行います。Dimは、変数用のメモリー領域を確保します。変数宣言時には、データ型を決める必要があります。データ型は変数という箱にどのような形式の値を保存するかで決定します。数字を格納するであればInteger、文字列を格納するのであれば、Stringを選択するのがよいでしょう。その他のデータ型については、「VBが扱えるデータ型」に記載している。
宣言
Dim 変数名 As データ型 '基本的な宣言
Dim 変数名1,変数名2,変数名3 As データ型 '複数の変数を宣言
Dim 変数名1 As データ型,変数名2 As データ型,変数名3 As データ型 '複数の変数を宣言
Dim 変数名 As データ型 = 値 '宣言と同時に初期値をセットする方法
サンプル
Dim a As Integer '基本的な宣言
Dim a,b,c As Integer '複数の変数を宣言
Dim a As Integer,b As String,c As Byte '複数の変数を宣言
Dim a As Integer = 10 '宣言と同時に初期値をセットする方法
データ型を省略した宣言
Dim 変数名 = 値
VBの初期値の代入によるデータ型の判別機能により、データ型を判別できます。
サンプル
Dim price = 10 'Integer型になります。
Dim title = ".NET VB" 'String型になります。
変数名の付け方
意味が分かる英単語にしましょう。例えば、価格であればprice、合計金額を計算するために、一時的に保存する場合は、totalAmountなどにすると良いだろう。
変数に代入してみる。
変数に、任意の値を格納することを代入といいます。代入には=等の代入演算子を使用します。
Dim price As Integer
price = 100 '変数priceに100を代入
Console.WriteLine("price値:" & price.ToString)
値型と参照型
VBで扱う変数では、メモリ上に直接割り当てられる領域に格納する値型と、データの参照情報が格納されている参照型があります。
値型
すべて数値型(Integer,Double等)やBoolean型、Char型、構造体、列挙型は値型となり、変数の宣言により確保されたメモリ領域に、直接そのデータが記録されます。値型データを扱う宣言すると、データを入れるためのメモリ領域が確保されます。値型は、メモリー上のスタック領域に格納されます。
参照型
参照型には、String型、Object型(Object型から派生するクラスも含みます。)があり、変数宣言により確保されたメモリ領域にデータが存在するヒープメモリに参照情報(アドレス)が記録されます。参照型データを扱う宣言すると、アドレスを格納するためのメモリ領域が確保されます。
定数の宣言
プログラムの実行中に変化しない値を定義したい場合使用します。また、プログラム中に何度も使用するような、消費税率や商品コード等を定数にしておくとよい。もちろん変数の初期値にセットしておくことでも同じことができますが、プログラムに書き換えが行われる可能性があるので、読み取り専用の定数を使用したほうが書き換わるリスクがありません。
また、メンテナンスも向上します。変更したい場合は、プログラム中に散在する変数の値を変更するのではなく、定数に設定している値を変更するだけで変更することができます。
宣言
Const 定数名 As データ型
一般的には、定数の変数名はすべて大文字で定義します。これは他の変数と視覚的に分かりやすくするためです。
Const TAXRATE As Double = 0.1 '消費税率の定数 消費税率が変わるとき定数に定義している値を変更するだけ済む。
Sub Main(args As String())
Dim tax As Integer
tax = 100 * TAXRATE
Console.WriteLine("消費税:" & tax.ToString)
End Sub
変数や定数の有効範囲(スコープ)
変数や定数は、宣言された場所やアクセス属性(Pvivate、Public、Protected、Friend)の指定によりアクセスできる有効範囲が決まっています。
ブロックスコープ
For Next、Doようなループ構造やif…thenのような条件判断構造のブロック内で宣言された変数や定数のスコープは宣言されたブロック内になります。プロシージャ(メソッド)内で宣言された変数や定数は、プロシージャ内でのみ有効で、プロシージャの終了とともにメモリから解放されます。
For i = 0 to 5
dim price As Integer = 0 'ブロックスコープの変数定義。For内のみアクセス可
price = 100
Console.WriteLine("priceの値:" & price .ToString())
Next i
モジュールスコープ
Dimまたは、Privateを使って宣言した変数、そのモジュール内のすべてのプロシージャで共通で使用できる。クラスや構造体、モジュール内部のスコープをモジュールスコープと呼びます。プロシージャの外で宣言した変数や定数のスコープは、宣言されたクラスや構造内部で有効なモジュールスコープとなり、内部のすべてのプロシージャ(メソッド)から利用できます。
Module Program
Private price As Integer = 0 'モジュールスコープ変数宣言と初期化
Sub Main(args As String())
'プロシージャ実行
SetPrice()
Console.WriteLine("priceの値:" & price.ToString)
End Sub
'プロシージャ定義
Sub SetPrice()
price = 100 'モジュールスコープの変数に100をセット
End Sub
End Module
プロジェクトスコープ(グローバルスコープ)
Publicキーワードを使って宣言した変数や定数のスコープは、宣言されたモジュールが含まれるプロジェクト内になり、同一のプロジェクト内のすべてのモジュールから利用できます。このような変数をグローバル変数、または、パブリック変数と呼びます。
Module Program
Sub Main(args As String())
'Module1内のパブリック変数priceの値を出力
Console.WriteLine("price値:" & Module1.price.ToString)
End Sub
End Module
'プロジェクトに追加した標準モジュール
Module Module1
Public price As Integer = 0
End Module
プロジェクトに標準モジュール(Module1)を追加し、パブリック変数を定義。ProgramモジュールからModule1の変数Priceにアクセス。
アクセス属性
プロシージャ、クラス、構造体ではキーワードを付けることでスコープを指定することができます。
Public
無条件で、あらゆる場所からアクセスができる。
Friend
同じプロジェクト内からアクセスすることができます。
Protected Friend
クラス内部。または、クラスから派生したクラスに同じプロジェクト内からアクセスすることができる。
Protected
クラス内部、または浦須から派生したクラスからのみアクセスすることができます。
Private
アクセスできるのは、同じプロシージャ、クラスや構造体、標準モジュール内部だけです。
変数名のネーミングに困ったら
変数名やクラス名、メソッド名、プロパティ名、プロシージャ名、テーブル名、カラム名codicというネーミングがサービスがあるので、活用してみよう。日本語で単語や文章を入力するだけで適切な変数名やクラス名、メソッド名等のネーミング候補を教えてくれます。また、拡張プラグインを各IDEに組み込むことで、ネーミングエンジンを使用することができます。
【対応プラグイン】
Visual Studio Code、Visual Studio、NetBeans、ATOM、Eclipse、IntelliJ IDEA、Sublime text 3、Excel VBA