記事内に広告が含まれています。

【VB.NET】SUBとFUNCTIONの違い

現場の若手(主に新卒)からよく質問あるのが、VB.NETで「Sub」と「Function」の違いが分からないということです。懇切丁寧に毎回説明するよりも、

OK Google!「VB.NET Sub Function 違い」を教えてくれないか?

みたいに検索してもらって、この記事読んでもらった方が良いかなと言うことで記事にします。

【スポンサーリンク】

SubとFunctionの違い

決定的な違い…戻り値の有無!

シンプルに述べると「戻り値があるorない」です。そんなことは調べれば幾らでも出てきます。「それじゃあ何のことか分からないじゃないか!」と言われる方も多いかもしれませんが、違いは戻り値の有無なんですよ。慣れて下さいとしか言いようがありません。実際にソースコードを書いてみます。

'Sub
Private Sub TestSub()
 'TestSub
End Sub

'Function
Private Function TestFunction() As String
 'TestFunction
End Function

見た目の違いとしては、Functionには「As String」というのが書かれていて、Subにはそんなものは無いと言うくらいでしょうか。この「As String」と言うのが戻り値の型で、このFinctionはString型の値を返しますよ、という意味です。Subは戻り値が無いので、戻り値の型なんてものは考えなくて良いです。

実際のソースコードで確認

さて、戻り値の有無で何が出来て何が出来ないのかと言うと、ソースコード的にはこんな感じです。VisualStudioでWindowsFormアプリケーションを作成し、ボタンを追加した後に、このソースコードを貼り付けてみて下さい。SubとFunction、それぞれの関数を呼び出しているソースです。

Public Class Form1
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Dim strTest As String = Nothing
  strTest = TestSub()
  strTest = TestFunction()
 End Sub

 Private Sub TestSub()
  'TestSub
 End Sub

 Private Function TestFunction() As String
  'TestFunction
  Dim sRet As String = Nothing
  sRet = "OK"
  Return sRet
 End Function
End Class

貼り付けると、VisualStudio上ではこんなことになっています。

f:id:neko_britannia:20200417144304j:plain

はい、これが戻り値の有無の話です。「strTest」という変数に、値を代入しようとしていますね。TestSub()は何か怒られてますが、TestFunctionは何も言われてません。関数を呼び出して、変数に代入しようとするときに、怒られるのがSubで、怒られないのがFunctionです。Functionは戻り値を持つので、関数の結果を変数に代入することが出来ます。

もうちょい分かりやすく

えーと、昔からよく言われるのが話す内容がようわからんということですね。今回の件を端的に、シンプルに、そしてエレガントに言うと…

  • Sub:一方的に話かけるだけ(戻り値無い)
  • Function:返事がある前提で話かける(戻り値ある)

ということでしょうか。私は一方的に話かけるのでSub人間ですね。みなさん、Sub人間とか言われない様に気を付けて下さいね。

【スポンサーリンク】

編集後記

世の中のVB.NETプログラマーが救われますように祈っています。

.