web-dev-qa-db-ja.com

VB.NET関数の戻り値

VB.NET関数から値を返すには、「関数名」に値を割り当てるか、「戻り値」を使用します。

同じ機能でこれらが混在する場合があります。個人的には、返品を好む。

私の質問は、2つの内部の違いは、もしあれば、何ですか?

25
user50612

おそらく違いはありません。 IIRC、コンパイラによって生成されたILは、両方をReturnステートメントに変換します_ returnValue変数の追加の使用がない限り

FunctionName割り当ての可読性は、私の見解では不十分であり、VB6の悪い習慣の例です。私は_returnValue(NOT RETVAL)変数メソッドも好みます。

14
StingyJack

違いは、彼らが異なることをするということです!

「戻り値」は2つのことを行います。
1。その時点で関数の戻り値を設定します。2。すぐに関数を終了します。

関数内のそれ以上のコードは実行されません!

'Functionname = value'は1つのことを行います:1.その時点で関数の戻り値を設定します

関数内の他のコードは引き続き実行されますこれにより、追加のロジックで関数の戻り値を調整またはオーバーライドできます

巨大な違いの人々。それは状態のすべてではなく、流れの問題でもあります。

52
noeldp

見てみましょう...奇妙なことに、 "functionName ="はILの生成を減らしますか?

コード:

Public Function Test() As String
    Test = "Test"
End Function


Public Function Test2() As String
    Return "Test"
End Function

IL:

.method public static string Test() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: ret 
}

.method public static string Test2() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test2)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: br.s L_0009
    L_0009: ldloc.0 
    L_000a: ret 
}
17
TGnat

以下を実行することは、コードを簡単に移植するための Visual Basic 6. 開発者にのみ提供されます。

Public Function MyFunction() As String
    MyFunction = "Hello"
End Function

この構文が混乱するので、プロジェクトにVisual Basic 6.0で作業したことがない人が含まれている場合は、これを続けることは絶対にお勧めしません。

6
Tom Anderson

100回のうち99回「戻り値」を使います。

たまに、他の型が変数宣言を保存できるようにするだけでなく、実際に関数を大幅に明確にする方法でそれを行う関数があります。通常、これはとにかく戻り値に関数と同じ名前を付けたい場合に発生し、多くの場合、これらは再帰関数です。その構造についての何かがそれを暗黙の戻り変数に貸す。ただし、そのシナリオは非常にまれです。現在のプロジェクトで暗黙の戻り変数を使用する関数があるかどうかはわかりません。

1
Joel Coehoorn

サードパーティのファクトリー(_hsf)を操作するときに非常に便利です。戻り変数の宣言を回避できます。

Public Function CreateExtremum(iShape As INFITF.Reference, iDir1 As HybridShapeTypeLib.HybridShapeDirection, iSide1 As Integer, iDir2 As HybridShapeTypeLib.HybridShapeDirection, iSide2 As Integer, iDir3 As HybridShapeTypeLib.HybridShapeDirection, iSide3 As Integer) As HybridShapeTypeLib.HybridShapeExtremum
    CreateExtremum = _hsf.AddNewExtremum(iShape, iDir1, iSide1)
    CreateExtremum.Direction2 = iDir2
    CreateExtremum.ExtremumType2 = iSide2
    CreateExtremum.Direction3 = iDir3
    CreateExtremum.ExtremumType3 = iSide3
    CreateExtremum.Compute()
End Function
0
tsolina

[ツール]、[オプション]、[テキストエディター]、[すべての言語]、[コードレンズ]の順に選択すると、参照カウントが各Sub、Function、またはPropertyステートメントの上に表示されます。

「戻り値」は「関数名への値の割り当て」よりも優れているようです。後者の場合、「Code Lens」は膨張した参照カウントを生成します。

' Code Lens reports "0 references" here for Sub Rosa().
Public Sub Rosa()
    Diagnostics.Debug.WriteLine(Test())
    Diagnostics.Debug.WriteLine(Test2())
End Sub

' Code Lens reports "2 references" here for Function Test().
Public Function Test() As String
    Test = "Test"       ' Code Lens counts this as a reference.
End Function

' Code Lens reports "1 reference" here for Function Test2().
Public Function Test2() As String
    Dim strTest2 as String = "Test"
    Return strTest2     ' Code Lens does NOT count this as a reference.
End Function
0
Paul Margus

戻り値の構文が真の1つであることを読んだ後 。NET 実行方法わかりました。次に、私が知っている関数を作成し、KNEWを手に入れて、Returnステートメントから値を返すか、すべての状況で例外を返しました。それでも、関数が「すべてのパスで値を返さない」というコンパイラ警告が表示されました。 。

ありがたいことに、スタックオーバーフローの質問に遭遇しましたこの関数で「すべてのパスに値が返されない」という警告を生成しないようにするにはどうすればよいですか?理由を説明しました。関数の先頭にあるプロシージャ名にデフォルト値の割り当てを追加すると、私の場合も警告が防止されました。

したがって、構文の一貫性を保つために戻り値の構文を引き続き使用する場合でも、関数名にデフォルト値を割り当てて、偽の警告でコンパイルプロセスが煩雑になるのを防ぐことにします。

0
Alan K