Unterstützung für Verweisrückgabewerte (Visual Basic)

Die Sprache C# unterstützt Verweisrückgabewerte. Eine Möglichkeit zum Verständnis von Verweisrückgabewerten besteht darin, dass sie das Gegenteil von Argumenten sind, die als Verweis auf eine Methode übergeben werden. Wenn ein als Verweis übergebenes Argument geändert wird, werden die Änderungen im Wert der Variablen beim Aufrufer widergespiegelt. Wenn eine Methode einen Verweisrückgabewert für einen Aufrufer bereitstellt, werden Änderungen, die der Aufrufer am Verweisrückgabewert vorgenommen hat, in den Daten der aufgerufenen Methode widergespiegelt.

In Visual Basic können Sie keine Methoden mit Verweisrückgabewerten erstellen, Sie können Verweisrückgabewerte jedoch verarbeiten. Anders ausgedrückt: Sie können eine Methode mit einem Verweisrückgabewert aufrufen und diesen Rückgabewert ändern. Änderungen am Verweisrückgabewert werden dann in den Daten der aufgerufenen Methode widergespiegelt.

Direktes Ändern des Verweisrückgabewerts

In Methoden, die immer erfolgreich sind und keine ByRef-Parameter aufweisen, können Sie den Verweisrückgabewert direkt ändern. Weisen Sie dazu den Ausdrücken, die den Verweisrückgabewert zurückgeben, den neuen Wert zu.

Im folgenden C#-Beispiel wird eine NumericValue.IncrementValue-Methode definiert, die einen internen Wert inkrementiert und als Verweisrückgabewert zurückgibt.

using System;

public class NumericValue
{
   private int value = 0;

   public NumericValue(int value)
   {
      this.value = value;
   }

   public ref int IncrementValue()
   {
      value++;
      return ref value;
   }

   public int GetValue()
   {
      return value;
   }
}

Der Verweisrückgabewert wird dann vom Aufrufer im folgenden Visual Basic-Beispiel geändert. Beachten Sie, dass die Zeile mit dem Aufruf der NumericValue.IncrementValue-Methode der Methode keinen Wert zuweist. Stattdessen wird dem von der Methode zurückgegebenen Verweisrückgabewert ein Wert zugewiesen.

Module Example
   Public Sub Main()
      Dim n As New NumericValue(15)
      n.IncrementValue() += 12
      Console.WriteLine(n.GetValue) 
   End Sub
End Module
' Output:   28

Verwenden einer Hilfsmethode

In anderen Fällen ist es nicht immer wünschenswert, den Verweisrückgabewert eines Methodenaufrufs direkt zu ändern. Beispielsweise wird in einer Suchmethode, die eine Zeichenfolge zurückgibt, möglicherweise nicht immer ein Ergebnis gefunden. In diesem Fall sollten Sie den Verweisrückgabewert nur ändern, wenn die Suche erfolgreich war.

Dies wird im folgenden C#-Beispiel veranschaulicht. Darin wird eine in C# geschriebene Sentence-Klasse mit einer FindNext-Methode definiert, die nach dem nächsten Wort in einer Sequenz sucht, die mit einer angegebenen Teilzeichenfolge beginnt. Die Zeichenfolge wird als Verweisrückgabewert zurückgegeben, und eine vom Verweis an die Methode übergebene Boolean-Variable gibt an, ob die Suche Erfolg hatte. Der Verweisrückgabewert gibt an, dass der Aufrufer den zurückgegebenen Wert zusätzlich zum Lesen auch ändern kann und dass diese Änderung in den intern in der Sentence-Klasse enthaltenen Daten widergespiegelt wird.

using System;

public class Sentence
{
    private string[] words;
    private int currentSearchPointer;

    public Sentence(string sentence)
    {
        words = sentence.Split(' ');
        currentSearchPointer = -1;
    }

    public ref string FindNext(string startWithString, ref bool found)
    {
        for (int count = currentSearchPointer + 1; count < words.Length; count++)
        {
            if (words[count].StartsWith(startWithString))
            {
                currentSearchPointer = count;
                found = true;
                return ref words[currentSearchPointer];
            }
        }
        currentSearchPointer = -1;
        found = false;
        return ref words[0];
    }

    public string GetSentence()
    {
        string stringToReturn = null;
        foreach (var word in words)
            stringToReturn += $"{word} ";

        return stringToReturn.Trim();
    }
}

Das direkte Ändern des Verweisrückgabewerts ist in diesem Fall nicht zuverlässig, da die aufgerufene Methode möglicherweise keine Übereinstimmung findet und das erste Wort im Satz zurückgibt. In diesem Fall ändert der Aufrufer versehentlich das erste Wort des Satzes. Dies kann verhindert werden, indem der Aufrufer null (oder Nothing in Visual Basic) zurückgibt. In diesem Fall wird jedoch beim Versuch, eine Zeichenfolge mit dem Wert Nothing zu ändern, eine NullReferenceException ausgelöst. Es kann auch durch verhindert werden, indem der Aufrufer String.Empty zurückgibt. Dazu muss der Aufrufer jedoch eine Zeichenfolgenvariable definieren, deren Wert String.Empty ist. Der Aufrufer kann diese Zeichenfolge zwar ändern, jedoch hat die Änderung keinen Sinn, da die geänderte Zeichenfolge keine Beziehung zu den Wörtern in dem von der Sentence-Klasse gespeicherten Satz hat.

Die beste Möglichkeit zur Behandlung dieses Szenarios besteht darin, den Verweisrückgabewert durch Verweis an eine Hilfsmethode zu übergeben. Die Hilfsmethode enthält dann die Logik, die ermitteln kann, ob der Methodenaufruf erfolgreich war, und in diesem Fall den Verweisrückgabewert ändern kann. Der folgende Code zeigt eine mögliche Implementierung.

Module Example
   Public Sub Main()
      Dim sentence As New Sentence("A time to see the world is now.")
      Dim found = False
      Dim returns = RefHelper(sentence.FindNext("A", found), "A good", found) 
      Console.WriteLine(sentence.GetSentence()) 
   End Sub
   
   Private Function RefHelper(ByRef stringFound As String, replacement As String, success As Boolean) _ 
                    As (originalString As String, found As Boolean) 
      Dim originalString = stringFound
      If found Then stringFound = replacement
      Return (originalString, found)   
   End Function
End Module
' The example displays the following output:
'      A good time to see the world is now.

Siehe auch