Frage

Um einen Wert aus einer VB.NET-Funktion zurückzukehren ein Wert auf den „Funktionen Namen“ zuordnen kann oder verwenden „Rückgabewert.“

ich manchmal diese inter gemischt in der gleichen Funktion sehen. Ich persönlich ziehe die Rückkehr.

Meine Frage ist, was die interne Unterschied ist, wenn überhaupt, zwischen den beiden?

War es hilfreich?

Lösung

Es gibt wahrscheinlich keinen Unterschied. IIRC, der Compiler erzeugte IL wandelt sie beide in Return-Anweisungen es sei denn, es zusätzliche Verwendung eines _returnValue Variable .

Die Lesbarkeit der Funktionsname Zuordnung ist meiner Meinung nach schlecht, und ein Beispiel für eine schlechte Gewohnheit VB6. Ich ziehe die _returnValue (NICHT RETVAL) variable Methode auch.

Andere Tipps

Der Unterschied ist, dass sie verschiedene Dinge tun!

‚Rückgabewert‘ hat zwei Dinge:
1. Er setzt die Funktion Rückgabewert an diesem Punkt 2. Es wird sofort beendet die Funktion

Kein weiterer Code in der Funktion ausführt!

'Function = value' tut 1 Sache: 1. Es setzt die Funktion Rückgabewert an diesem Punkt

Anderer Code in der Funktion weiter ausführen Dies ermöglicht eine zusätzliche Logik zu verfeinern oder die Funktion Rückgabewert außer Kraft setzen

Sehr große Unterschied Leute. Denken Sie daran, es ist nicht alles über Zustand, sondern auch um Fluss.

Lassen Sie uns einen Blick darauf werfen ... Seltsamer die „functionName- =“ erzeugt weniger IL?

Code:

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 
}

Sie folgendermaßen vorgehen ist nur vorgesehen für Visual Basic 6.0 Entwickler der einfachen Port-Code über:

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

Ich würde auf jeden Fall halten nicht empfehlen, es zu tun, wenn Ihr Projekt jemand enthält, die mit Visual Basic 6.0 nicht funktioniert hat, da diese Syntax verwirrend sein wird.

99 von 100 werde ich „Rückgabewert“ verwenden.

Jeder einmal in eine Weile ich eine Funktion haben werden, wenn der andere Typ nicht nur mir eine Variablendeklaration speichern können, aber es in einer Weise tun, die tatsächlich erheblich die Funktion verdeutlicht. Normalerweise geschieht dies, wenn ich würde den Rückgabewert die gleiche wie die Funktion ohnehin nennen wollen, und oft sind diese rekursive Funktionen; etwas über dieses Konstrukt verleiht es den impliziten Rückgabevariable. Allerdings ist dieses Szenario extrem selten . Ich weiß nicht, ob ich irgendwelche Funktionen mit impliziter Rückkehr Variablen überhaupt in meinem aktuellen Projekt.

Nach dem Lesen, dass der Rückgabewert Syntax war die One True .NET Way Of Doing Dinge, die ich dachte „OK, wir werden es so machen, dann“. Dann schrieb ich eine Funktion, die ich kannte, Hand aufs Herz WUßTE, kehrte entweder einen Wert aus einer Return-Anweisung oder alternativ eine Ausnahme unter allen Umständen, und bekam noch einen Compiler Warnung, dass die Funktion „keinen Wert auf allen Pfaden zurückkehren“ .

Zum Glück kam ich auf die Frage Stack-Überlauf Wie kann ich diese Funktion erzeugen nicht eine „Rückkehr keinen Wert auf alle ? Pfade“Warnung , die erklärt, warum; einen Standardwert Zuordnung zu dem Prozedurnamen an der Spitze der Funktion Hinzufügen und die Warnung in meinem Fall verhindert werden.

Folglich, obwohl ich werde auch weiterhin die Rückgabewert Syntax einfach aus Gründen der Syntax Konsistenz zu verwenden, werde ich auch nur einen Standardwert für die Funktion Namen unübersichtlich die Möglichkeit zu verhindern, wird die Zuordnung die Kompilierung mit falsche Warnungen.

seine ganz praktisch, wenn mit 3rd-Party-Fabriken (_hsf) arbeiten, können Sie Rückkehr Variablen vermeiden deklarieren

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

Wenn Extras / Optionen / Text-Editor / Alle Sprachen / Code-Objektiv aktiviert ist, zeigt die Referenzzählung über jeden Sub, Function oder Property-Anweisung.

„Rückgabewert“ scheint besser als „Wert auf die Funktionen zuzuweisen Namen“. Im letzteren Fall "Code Lens" erzeugt einen aufgeblasenen Reference Count.

' 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top