どうも!リョクちゃです。
今回は、VB.Netのメソッドについて理解を深めていきます。
メソッドは関数とも呼ばれていたり、プロシージャとも呼ばれています。
※ 実際はこれらについても違いがあります。
ここも触れていけたらなと思います。
ちなみに前回は、こちらになります。
目次
メソッド
メソッドとは、オブジェクト指向言語で扱われる名称で関数とも呼ばれます。
プログラムの一連の処理をまとめたモノをメソッドといいます。
VB.Netでは、メソッドの他にプロシージャと呼ばれるものがあります。
それぞれ説明していきます。
戻り値や返り値を返すのがメソッド → Function(≒関数)
一方で、
戻り値や返り値を返さないのをプロシージャ → Sub
とそれぞれ区別されています。
コードで書くと、それぞれ下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Class main ' メソッド Public Function Test_1() As Integer Dim a As Integer = 5 Dim b As Integer = 10 Return a + b ' 結果を返す End Function ' プロシージャ Public Sub Test_2() Console.WriteLine("Hello World") ' Hello Worldを出力 End Sub End Class |
こんな感じになります。
メソッドやプロシージャを学ぶ上で必須となるモノ①
それが、”値渡し”と”参照渡し”といった考え方になります。
値渡し → Byval
引数(ひきすう)そのものを値として受け取ります。
引数として渡す変数の値を呼び出し先で変更したくない場合に使います。
参照渡し → Byref
引数を参照する情報として受け取ります。
引数として渡す変数の値を呼び出し先の処理によって変更したい場合に使います。
それぞれ形としては、
(Byval <変数名> As <型名>, Byref <変数名> As <型名>)
になります。
実際に書いてみると、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Class main ' 最初に実行される処理 Public Sub ValueTest() Dim a As Integer = 10 Dim b As Integer = 5 Dim c As Integer = 0 Console.WriteLine(c) ' 結果: 0 Call Test(a, b, c) ' Testプロシージャを呼び出して実行しています。 Console.WriteLine(c) ' 結果 : 15 End Sub ' 引数oneと引数bを値渡しで、引数answerを参照渡しとして記述しています。 Public Sub Test(Byval one As Integer, Byval two As Integer, Byref answer As Integer) answer = one + two End Sub End Class |
最初にValueTestのSubプロシージャ内の変数cの値は0として表示されますが、
Testプロシージャを呼び出して実行した後は、値15が代入されて返ってきます。
これは変数cを、Testプロシージャを実行する際に参照渡しをしているからです。
参照渡しでは、呼び出し元の変数の値を呼び出し後に処理された値へと上書きがされます。
下表に変数cの状態を処理の順番ごとに流れを示します。
順番 | 関数名 | 変数cの状態 |
---|---|---|
1 | ValueTest | 0 |
2 | Test | 15 |
3 | ValueTest | 15 |
参照渡しは、作成したFunctionの戻り値とは別の値を受け取りたい場合や
引数として渡した変数が処理によって変化する場合に使うと便利です。
メソッドやプロシージャを学ぶ上で必須となるモノ②
オプション引数 → Optional (Byval or Byref)
値渡しや参照渡しの先頭にOptionalを付加することで、
オプション引数として扱うことができます。
これは引数を省略したいときに使うことができます。
コードで書くと、
1 2 3 4 5 6 7 8 |
Class main ' オプション引数 Public Sub Test(Optional Byval msg As String = "Hello World") Console.WriteLine(msg) End Sub End Class |
これを実行すると、Hello Worldと出力がされます。
あらかじめ値が決まっていて、ある処理の時だけ値を変えて、
処理を分岐させる場合には便利かと思います。
メソッドやプロシージャを学ぶ上で必須となる考え方
引数の順番 → ① Byval or Byref ② Optional
引数を付けていくうえで、実は順番があります。
たとえば、このようなコードがあった場合、実行するとどうなるでしょう?
1 2 3 4 5 6 7 8 |
Class main ' 引数 Public Sub Test(Optional Byval msg As String = "Hello ", Byval a As String) Console.WriteLine(msg + a) End Sub End Class |
実はエラーとなってしまいます。
これは引数の順番が正しくないことからコンパイルエラーとなってしまいます。
正しくは、
1 2 3 4 5 6 7 8 |
Class main ' 引数 Public Sub Test(Byval a As String, Optional Byval msg As String = "Hello ") Console.WriteLine(msg + a) End Sub End Class |
こうなります。
まとめ
メソッド(関数)やプロシージャ、値渡しや参照渡しについて、簡単に解説しました。
プログラミング言語には、それぞれ特有の専門用語あったりします。
基本的にどのプログラミング言語においても考え方は共通なのですが、
呼び方を変えて名称づけされている場合が多く見受けられます。
例えば、メソッド≒関数のような場合。
これには意味があって関数とメソッドを区別しています。
今回は、VB.Net内で使われる用語を簡単に説明しました。
メソッドとプロシージャ
値渡しと参照渡し
メソッドで記述する引数は順番が大事
① Byval や Byref
② Optional Byval や Optional Byref
この順番を間違えるとコンパイルエラーになるので注意。
最後までご覧いただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。