ヘッダー
Visual Basic サンプル集
VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

メソッドの宣言

2021/3/28

→ C# のサンプルに切り替える

Visual Basic での関連用語

・関数はメソッドの一種です。値を返すメソッドを関数と呼びます。

・プロシージャには下記の図で挙げたものの他にもあります。

メモ:これとは異なる考え方もありえます。詳細な議論は割愛します。

 

値を返さないメソッド

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DoSomething()

    Debug.WriteLine("DoSomethingを実行します。")
    
End Sub

Debug.WriteLineが表示される場所

メモ:C# や Java などの言語で言うところの void で宣言されているメソッドです。

 

 

値を返すメソッド

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Function DoSomething() As Integer

    Return 627
    
End Function

 

 

1つの引数をとるメソッド

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DoSomething(arg1 As String)

    Debug.WriteLine($"受け取った引数は {arg1} です。")
    'Debug.WriteLine("受け取った引数は " & arg1 & " です。") '←VB2013以前の場合
    
End Sub

Debug.WriteLineが表示される場所

 

 

2つの引数をとるメソッド

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DoSomething(arg1 As String, arg2 As Integer)

    Debug.WriteLine($"受け取った引数は {arg1} {arg2} です。")
    'Debug.WriteLine("受け取った引数は " & arg1 & " と " & arg2 & " です。") '←VB2013以前の場合
    
End Sub

Debug.WriteLineが表示される場所

 

 

引数の違う同じ名前の複数のメソッドの宣言(オーバーロード)

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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 の効果が優先されます。そのため、付けておくのが無難です。

メモ:型違いのいろいろな引数に対応する必要がある場合は、型パラメーター(ジェネリック)の使用も検討します。

 

 

不特定の数の引数をとるメソッド

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

Debug.WriteLineが表示される場所

 

 

共有メソッド(静的メソッド)

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Shared Sub DoSomething()

    Debug.WriteLine("DoSomethingを実行します。")
    
End Sub

Debug.WriteLineが表示される場所

 

 

省略可能引数

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DoSomething(arg1 As Integer, Optional arg2 As Integer = 0)

    Debug.WriteLine("DoSomethingを実行します。")
    
End Sub

メモ:省略可能な引数に値が渡されたかどうか直接確認する方法はありません。多くの場合既定値にありえない値を設定しておくことで区別できるようにします。

Debug.WriteLineが表示される場所

 

 

1つの型パラメーターをとるメソッド(ジェネリック)

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DoSomething(Of T)(arg1 As T)

    Debug.WriteLine($"受け取った引数は {arg1} です。型は {GetType(T).FullName} です。")
    'Debug.WriteLine("受け取った引数は " & arg1.ToString() & " です。型は " & GetType(T).FullName & " です。") '←VB2013以前の場合
    
End Sub

Debug.WriteLineが表示される場所

 

 

2つの型パラメーターをとるメソッド(ジェネリック)

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Function DoSomething(Of T1, T2)(arg1 As T1) As T2

    Debug.WriteLine($"受け取った引数は {arg1} です。")
    'Debug.WriteLine("受け取った引数は " & arg1.ToString() & " です。") '←VB2013以前の場合
  
    Return Nothing
  
End Function

Debug.WriteLineが表示される場所

 

 

抽象メソッド(純粋仮想関数)

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応


Public MustOverride Function DoSomething(arg1 As String) As Long

メモ:抽象メソッドは抽象クラス(MustInheritで宣言されたクラス)内でのみ宣言できます。

メモ:仮想関数はキーワード Overridable で宣言できます。

 

 

参照渡しの引数

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub DoSomething(ByRef arg1 As String)

    Debug.WriteLine($"受け取った引数は {arg1} です。")
    'Debug.WriteLine("受け取った引数は " & arg1 & " です。") '←VB2013以前の場合

    arg1 = "引数の値を書き換えます。" '参照渡しなので呼び出し元に影響します。
    
End Sub

Debug.WriteLineが表示される場所

メモ:参照渡しは計画的にご利用ください。→ 初級講座[改訂版] 第27回 引数の参照渡しと値渡し 参照

メモ:C# にある in と out はありません。 VBのByRef は C# の ref とほぼ同等です。

 

 

名前のない複数の戻り値

VB2017対応 VB2019対応

Public Function DoSomething() As (Integer, String)

    Return (627, "徳川家康")
    
End Function

呼び出し例

VB2017対応 VB2019対応

Dim result = DoSomething()
Debug.WriteLine(result.Item1) '627 と出力されます。
Debug.WriteLine(result.Item2) '徳川家康 と出力されます。

Debug.WriteLineが表示される場所

 

 

名前付きの複数の戻り値

VB2017対応 VB2019対応

Public Function DoSomething() As (TotalCount As Integer, CaptainName As String)

    Return (627, "徳川家康")
    
End Function

呼び出し例

VB2017対応 VB2019対応

Dim result = DoSomething()
Debug.WriteLine(result.TotalCount) '627 と出力されます。
Debug.WriteLine(result.CaptainName) '徳川家康 と出力されます。

Debug.WriteLineが表示される場所

 

 

非同期実行されるメソッド

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Async Sub AsyncDoSomething()

    Await Task.Run(Sub()
                       Debug.WriteLine("ここに記述した処理は呼び出し元とは非同期で実行されます。")
                   End Sub)

End Sub

Debug.WriteLineが表示される場所

メモ:第29回 アプリケーションのライフサイクルの基本 参照

 

 

コルーチン

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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が表示される場所

参考

Yield ステートメント - Visual Basic | Microsoft Docs

 

 

式形式のメソッド

VBでは式形式でメソッドを定義することはできません。

 

 

ラムダ式によるローカルの関数

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Dim add = Function(x As Integer, y As Integer) x + y

Debug.WriteLine(add(2, 3)) '5 と出力されます。
Debug.WriteLine(add(8, 10)) '18 と出力されます。

Debug.WriteLineが表示される場所

メモ:値を返さない場合 Sub で定義できます。

 

複数行の処理を記述することもできます。

VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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 と出力されます。

Debug.WriteLineが表示される場所

 

 

ローカル関数

VBにはローカル関数は存在しません。

一番似ている機能は上掲の ラムダ式によるローカルの関数 です。

 

 


VB6対応 VB6でも Sub ~ End Sub、Function ~ End Function を使用します。