Visual Basic サンプル集 |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
メソッドの宣言
2021/3/28
目次
Visual Basic での関連用語
・関数はメソッドの一種です。値を返すメソッドを関数と呼びます。
・プロシージャには下記の図で挙げたものの他にもあります。
メモ:これとは異なる考え方もありえます。詳細な議論は割愛します。
値を返さないメソッド
Public Sub DoSomething()
Debug.WriteLine("DoSomethingを実行します。")
End Sub
メモ:C# や Java などの言語で言うところの void で宣言されているメソッドです。
値を返すメソッド
Public Function DoSomething() As Integer
Return 627
End Function
1つの引数をとるメソッド
Public Sub DoSomething(arg1 As String)
Debug.WriteLine($"受け取った引数は {arg1} です。")
'Debug.WriteLine("受け取った引数は " & arg1 & " です。") '←VB2013以前の場合
End Sub
2つの引数をとるメソッド
Public Sub DoSomething(arg1 As String, arg2 As Integer)
Debug.WriteLine($"受け取った引数は {arg1} と {arg2} です。")
'Debug.WriteLine("受け取った引数は " & arg1 & " と " & arg2 & " です。") '←VB2013以前の場合
End Sub
引数の違う同じ名前の複数のメソッドの宣言(オーバーロード)
Public Overloads Sub SameName()
'内容省略
End Sub
Public Overloads Sub SameName(arg1 As String)
'内容省略
End Sub
Public Overloads Sub SameName(arg1 As Integer)
'内容省略
End Sub
メモ:Overloads は省略可能ですが、親クラスでも同じ名前のメソッドがある場合に省略すると Shadows の効果が優先されます。そのため、付けておくのが無難です。
メモ:型違いのいろいろな引数に対応する必要がある場合は、型パラメーター(ジェネリック)の使用も検討します。
不特定の数の引数をとるメソッド
Public Sub DoSomething(ParamArray args() As Integer)
Debug.WriteLine($"受け取った引数の数は {args.Length} 個です。")
'Debug.WriteLine("受け取った引数の数は " & args.Length & " 個です。")'←VB2013以前の場合
For Each arg As Integer In args
Debug.WriteLine(arg.ToString())
Next
End Sub
共有メソッド(静的メソッド)
Public Shared Sub DoSomething()
Debug.WriteLine("DoSomethingを実行します。")
End Sub
省略可能引数
Public Sub DoSomething(arg1 As Integer, Optional arg2 As Integer = 0)
Debug.WriteLine("DoSomethingを実行します。")
End Sub
メモ:省略可能な引数に値が渡されたかどうか直接確認する方法はありません。多くの場合既定値にありえない値を設定しておくことで区別できるようにします。
1つの型パラメーターをとるメソッド(ジェネリック)
Public Sub DoSomething(Of T)(arg1 As T)
Debug.WriteLine($"受け取った引数は {arg1} です。型は {GetType(T).FullName} です。")
'Debug.WriteLine("受け取った引数は " & arg1.ToString() & " です。型は " & GetType(T).FullName & " です。") '←VB2013以前の場合
End Sub
2つの型パラメーターをとるメソッド(ジェネリック)
Public Function DoSomething(Of T1, T2)(arg1 As T1) As T2
Debug.WriteLine($"受け取った引数は {arg1} です。")
'Debug.WriteLine("受け取った引数は " & arg1.ToString() & " です。") '←VB2013以前の場合
Return Nothing
End Function
抽象メソッド(純粋仮想関数)
Public MustOverride Function DoSomething(arg1 As String) As Long
メモ:抽象メソッドは抽象クラス(MustInheritで宣言されたクラス)内でのみ宣言できます。
メモ:仮想関数はキーワード Overridable で宣言できます。
参照渡しの引数
Public Sub DoSomething(ByRef arg1 As String)
Debug.WriteLine($"受け取った引数は {arg1} です。")
'Debug.WriteLine("受け取った引数は " & arg1 & " です。") '←VB2013以前の場合
arg1 = "引数の値を書き換えます。" '参照渡しなので呼び出し元に影響します。
End Sub
メモ:参照渡しは計画的にご利用ください。→ 初級講座[改訂版] 第27回 引数の参照渡しと値渡し 参照
メモ:C# にある in と out はありません。 VBのByRef は C# の ref とほぼ同等です。
名前のない複数の戻り値
Public Function DoSomething() As (Integer, String)
Return (627, "徳川家康")
End Function
呼び出し例
Dim result = DoSomething()
Debug.WriteLine(result.Item1) '627 と出力されます。
Debug.WriteLine(result.Item2) '徳川家康 と出力されます。
名前付きの複数の戻り値
Public Function DoSomething() As (TotalCount As Integer, CaptainName As String)
Return (627, "徳川家康")
End Function
呼び出し例
Dim result = DoSomething()
Debug.WriteLine(result.TotalCount) '627 と出力されます。
Debug.WriteLine(result.CaptainName) '徳川家康 と出力されます。
非同期実行されるメソッド
Public Async Sub AsyncDoSomething()
Await Task.Run(Sub()
Debug.WriteLine("ここに記述した処理は呼び出し元とは非同期で実行されます。")
End Sub)
End Sub
メモ:第29回 アプリケーションのライフサイクルの基本 参照
コルーチン
Public Iterator Function GetNumbers() As IEnumerable(Of Integer)
Yield 6
Yield 2
Yield 7
End Function
呼び出し例
For Each number As Integer In GetNumbers()
Debug.WriteLine(number)
Next
「6」「2」「7」と3行出力されます。→ Debug.WriteLineが表示される場所
参考
式形式のメソッド
VBでは式形式でメソッドを定義することはできません。
ラムダ式によるローカルの関数
Dim add = Function(x As Integer, y As Integer) x + y
Debug.WriteLine(add(2, 3)) '5 と出力されます。
Debug.WriteLine(add(8, 10)) '18 と出力されます。
メモ:値を返さない場合 Sub で定義できます。
複数行の処理を記述することもできます。
Dim trimNull = Function(value As String) As String
If value Is Nothing Then
Return ""
End If
Return value
End Function
Debug.WriteLine(trimNull("Hello")) 'Hello と出力されます。
ローカル関数
VBにはローカル関数は存在しません。
一番似ている機能は上掲の ラムダ式によるローカルの関数 です。
VB6でも Sub ~ End Sub、Function ~ End Function を使用します。