現場の若手(主に新卒)からよく質問あるのが、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上ではこんなことになっています。
はい、これが戻り値の有無の話です。「strTest」という変数に、値を代入しようとしていますね。TestSub()は何か怒られてますが、TestFunctionは何も言われてません。関数を呼び出して、変数に代入しようとするときに、怒られるのがSubで、怒られないのがFunctionです。Functionは戻り値を持つので、関数の結果を変数に代入することが出来ます。
もうちょい分かりやすく
えーと、昔からよく言われるのが話す内容がようわからんということですね。今回の件を端的に、シンプルに、そしてエレガントに言うと…
- Sub:一方的に話かけるだけ(戻り値無い)
- Function:返事がある前提で話かける(戻り値ある)
ということでしょうか。私は一方的に話かけるのでSub人間ですね。みなさん、Sub人間とか言われない様に気を付けて下さいね。
編集後記
世の中のVB.NETプログラマーが救われますように祈っています。
.