VB.NET関数から値を返すには、「関数名」に値を割り当てるか、「戻り値」を使用します。
同じ機能でこれらが混在する場合があります。個人的には、返品を好む。
私の質問は、2つの内部の違いは、もしあれば、何ですか?
おそらく違いはありません。 IIRC、コンパイラによって生成されたILは、両方をReturnステートメントに変換します_ returnValue変数の追加の使用がない限り。
FunctionName割り当ての可読性は、私の見解では不十分であり、VB6の悪い習慣の例です。私は_returnValue(NOT RETVAL)変数メソッドも好みます。
違いは、彼らが異なることをするということです!
「戻り値」は2つのことを行います。
1。その時点で関数の戻り値を設定します。2。すぐに関数を終了します。
関数内のそれ以上のコードは実行されません!
'Functionname = value'は1つのことを行います:1.その時点で関数の戻り値を設定します
関数内の他のコードは引き続き実行されますこれにより、追加のロジックで関数の戻り値を調整またはオーバーライドできます
巨大な違いの人々。それは状態のすべてではなく、流れの問題でもあります。
見てみましょう...奇妙なことに、 "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
}
以下を実行することは、コードを簡単に移植するための Visual Basic 6. 開発者にのみ提供されます。
Public Function MyFunction() As String
MyFunction = "Hello"
End Function
この構文が混乱するので、プロジェクトにVisual Basic 6.0で作業したことがない人が含まれている場合は、これを続けることは絶対にお勧めしません。
100回のうち99回「戻り値」を使います。
たまに、他の型が変数宣言を保存できるようにするだけでなく、実際に関数を大幅に明確にする方法でそれを行う関数があります。通常、これはとにかく戻り値に関数と同じ名前を付けたい場合に発生し、多くの場合、これらは再帰関数です。その構造についての何かがそれを暗黙の戻り変数に貸す。ただし、そのシナリオは非常にまれです。現在のプロジェクトで暗黙の戻り変数を使用する関数があるかどうかはわかりません。
サードパーティのファクトリー(_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
[ツール]、[オプション]、[テキストエディター]、[すべての言語]、[コードレンズ]の順に選択すると、参照カウントが各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
戻り値の構文が真の1つであることを読んだ後 。NET 実行方法わかりました。次に、私が知っている関数を作成し、KNEWを手に入れて、Returnステートメントから値を返すか、すべての状況で例外を返しました。それでも、関数が「すべてのパスで値を返さない」というコンパイラ警告が表示されました。 。
ありがたいことに、スタックオーバーフローの質問に遭遇しましたこの関数で「すべてのパスに値が返されない」という警告を生成しないようにするにはどうすればよいですか?理由を説明しました。関数の先頭にあるプロシージャ名にデフォルト値の割り当てを追加すると、私の場合も警告が防止されました。
したがって、構文の一貫性を保つために戻り値の構文を引き続き使用する場合でも、関数名にデフォルト値を割り当てて、偽の警告でコンパイルプロセスが煩雑になるのを防ぐことにします。