Unterstützung für verweisrückgabewerte (Visual Basic)Support for reference return values (Visual Basic)

Beginnend mit C# 7.0 die C# Abfragesprache unterstützt die verweisen auf Rückgabewerte.Starting with C# 7.0, the C# language supports reference return values. Eine Möglichkeit, verweisrückgabewerte zu verstehen ist, dass sie das Gegenteil von Argumenten, die durch einen Verweis auf eine Methode übergeben werden.One way to understand reference return values is that they are the opposite of arguments that are passed by reference to a method. Wenn ein Argument als Verweis übergeben wird, geändert wird, werden die Änderungen der Aufrufer im Wert der Variablen angezeigt.When an argument passed by reference is modified, the changes are reflected in value of the variable on the caller. Wenn eine Methode ein verweisrückgabewert an einem Aufrufer bereitstellt, werden Änderungen an der verweisrückgabewert vom Aufrufer in der aufgerufenen Methode Daten wiedergegeben.When an method provides a reference return value to a caller, modifications made to the reference return value by the caller are reflected in the called method's data.

Visual Basic erlaubt nicht, Sie zum Erstellen von Methoden mit verweisrückgabewerten Werte zurückgeben, aber es lässt Sie verweisrückgabewerte verarbeiten.Visual Basic does not allow you to author methods with reference return values, but it does allow you to consume reference return values. Das heißt, können Sie eine Methode mit einem verweisrückgabewert aufrufen und ändern Sie diesen Rückgabewert, und Änderungen an der verweisrückgabewert werden in der aufgerufenen Methode Daten wiedergegeben.In other words, you can call a method with a reference return value and modify that return value, and changes to the reference return value are reflected in the called method's data.

Den Ref-Rückgabewert ändern direktModifying the ref return value directly

Für Methoden, die immer erfolgreich sein und verfügen über keine ByRef Parameter, Sie können der verweisrückgabewert direkt ändern.For methods that always succeed and have no ByRef parameters, you can modify the reference return value directly. Dazu müssen Sie die Ausdrücke, die der verweisrückgabewert gibt den neuen Wert zuweisen.You do this by assigning the new value to the expressions that returns the reference return value.

Die folgenden C# Beispiel definiert eine NumericValue.IncrementValue Rückgabewert der Methode, die einen internen Wert inkrementiert und wird als Verweis zurückgegeben werden.The following C# example defines a NumericValue.IncrementValue method that increments an internal value and returns it as a reference return value.

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 Verweis zurückgeben, dass ein Wert vom Aufrufer in der folgenden Visual Basic wird anschließend geändert werden.The reference return value is then modified by the caller in the following Visual Basic example. Beachten Sie, dass die Zeile mit der NumericValue.IncrementValue Methodenaufruf weist keinen Wert an die Methode.Note that the line with the NumericValue.IncrementValue method call does not assign a value to the method. Stattdessen weist es einen Wert, der von der Methode zurückgegebenen verweisrückgabewert.Instead, it assigns a value to the reference return value returned by the method.

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

Mittels einer HilfsmethodeUsing a helper method

In anderen Fällen kann der verweisrückgabewert eines Methodenaufrufs direkt ändern nicht immer wünschenswert sein.In other cases, modifying the reference return value of a method call directly may not always be desirable. Beispielsweise kann eine Search-Methode, die eine Zeichenfolge zurückgibt, nicht immer eine Übereinstimmung gefunden werden.For example, a search method that returns a string may not always find a match. Sie möchten in diesem Fall der verweisrückgabewert nur ändern, wenn die Suche erfolgreich ist.In that case, you want to modify the reference return value only if the search is successful.

Die folgenden C# Beispiel veranschaulicht dieses Szenario.The following C# example illustrates this scenario. Definiert eine Sentence in geschriebenen Klasse C# umfasst eine FindNext Methode, die das nächste Wort im Satz gefunden wird, die mit einer angegebenen Teilzeichenfolge beginnt.It defines a Sentence class written in C# includes a FindNext method that finds the next word in a sentence that begins with a specified substring. 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.The string is returned as a reference return value, and a Boolean variable passed by reference to the method indicates whether the search was successful. Der Verweis-Rückgabewert gibt an, dass der Aufrufer den zurückgegebenen Wert nicht nur lesen kann; er oder sie können auch ändern, es, und diese Änderung wirkt sich die Daten intern in der Sentence Klasse.The reference return value indicates that the caller can not only read the returned value; he or she can also modify it, and that modification is reflected in the data contained internally in the Sentence class.

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();    
    }
}

Direktes Ändern des Verweis ist der Rückgabewert in diesem Fall nicht zuverlässig, da der Aufruf der Methode möglicherweise keine Übereinstimmung gefunden, und geben Sie das erste Wort im Satz zurück.Directly modifying the reference return value in this case is not reliable, since the method call may fail to find a match and return the first word in the sentence. In diesem Fall wird der Aufrufer nicht versehentlich das erste Wort des Satzes ändern.In that case, the caller will inadvertently modify the first word of the sentence. Dies kann verhindert werden, durch den Aufrufer zurückgeben einer null (oder Nothing in Visual Basic).This could be prevented by the caller returning a null (or Nothing in Visual Basic). Aber in diesem Fall versucht, eine Zeichenfolge, deren Wert Nothing löst eine NullReferenceException.But in that case, attempting to modify a string whose value is Nothing throws a NullReferenceException. Wenn auch durch den Aufrufer zurückgeben verhindert werden könnte String.Empty, aber dies erfordert, dass der Aufrufer eine String-Variable definieren, deren Wert String.Empty.If could also be prevented by the caller returning String.Empty, but this requires that the caller define a string variable whose value is String.Empty. Während der Aufrufer diese Zeichenfolge nicht ändern kann, dient die Änderung selbst keinen Zweck, da die geänderte Zeichenfolge keine Beziehung zu den Wörtern in den Satz von gespeichert hat die Sentence Klasse.While the caller can modify that string, the modification itself serves no purpose, since the modified string has no relationship to the words in the sentence stored by the Sentence class.

Die beste Methode zum Behandeln dieses Szenarios ist der verweisrückgabewert als Verweis an eine Hilfsmethode zu übergeben.The best way to handle this scenario is to pass the reference return value by reference to a helper method. Die Hilfsmethode enthält die Logik, um zu bestimmen, ob der Methodenaufruf erfolgreich war, und wenn dies der Fall ist, zum Ändern der verweisrückgabewert.The helper method then contains the logic to determine whether the method call succeeded and, if it did, to modify the reference return value. Im folgenden Beispiel wird eine mögliche Implementierung.The following example provides a possible implementation.

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 auchSee also