Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die C#-Sprache unterstützt Referenzrücklaufwerte. Eine Möglichkeit, referenzierte Rückgabewerte zu verstehen, besteht darin, dass sie das Gegenteil von Argumenten sind, die durch Verweis auf eine Methode übergeben werden. Wenn ein Argument, das per Referenz übergeben wird, geändert wird, werden die Änderungen im Wert der Variablen des Aufrufers 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.
Visual Basic ermöglicht es Ihnen nicht, Methoden mit Verweisrücklaufwerten zu erstellen, sie ermöglicht ihnen jedoch die Nutzung von Referenzrücklaufwerten. Mit anderen Worten, Sie können eine Methode mit einem Referenzrückgabewert aufrufen und diesen Wert ändern, und Änderungen am Referenzrückgabewert werden in den Daten der aufgerufenen Methode widergespiegelt.
Direktes Ändern des Referenz-Rückgabewerts
Bei Methoden, die immer erfolgreich sind und keine ByRef Parameter aufweisen, können Sie den Verweisrückwert direkt ändern. Dazu weisen Sie den Ausdrücken, die den Verweisrückwert zurückgeben, den neuen Wert zu.
Im folgenden C#-Beispiel wird eine NumericValue.IncrementValue Methode definiert, die einen internen Wert erhöht und als Verweis-Rü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 NumericValue.IncrementValue Methodenaufruf der Methode keinem Wert zuweist. Stattdessen weist sie dem von der Methode zurückgegebenen Verweiswert einen Wert zu.
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. Eine Suchmethode, die eine Zeichenfolge zurückgibt, findet z. B. möglicherweise nicht immer eine Übereinstimmung. In diesem Fall möchten Sie den Verweisrückwert nur ändern, wenn die Suche erfolgreich ist.
Das folgende C#-Beispiel veranschaulicht dieses Szenario. Sie definiert eine Sentence klasse, die in C# geschrieben wurde, enthält eine FindNext Methode, die das nächste Wort in einem Satz findet, der mit einer angegebenen Teilzeichenfolge beginnt. Die Zeichenfolge wird als Verweisrückwert zurückgegeben, und eine Boolean Variable, die durch Verweis auf die Methode übergeben wird, gibt an, ob die Suche erfolgreich war. Der Verweisrückwert gibt an, dass der Aufrufer zusätzlich zum Lesen des zurückgegebenen Werts auch sie ändern kann und dass diese Änderung in den Daten, die intern in der Sentence Klasse enthalten sind, 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 Referenzrückgabewerts in diesem Fall ist nicht zuverlässig, da der Methodenaufruf unter Umständen keine Übereinstimmung findet und das erste Wort des Satzes zurückgibt. In diesem Fall ändert der Aufrufer versehentlich das erste Wort des Satzes. Dies kann verhindert werden, indem der Aufrufer eine null (oder Nothing in Visual Basic) zurückgibt. Aber in diesem Fall wirft der Versuch, eine Zeichenfolge mit dem Wert Nothing zu ändern, eine NullReferenceException. 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. Während der Aufrufer diese Zeichenfolge ändern kann, dient die Änderung selbst keinem Zweck, da die geänderte Zeichenfolge keine Beziehung zu den Wörtern im Satz aufweist, der von der Sentence Klasse gespeichert ist.
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, um zu bestimmen, ob der Methodenaufruf erfolgreich war, und falls ja, den Rückgabewert des Verweises zu ändern. Im folgenden Beispiel wird eine mögliche Implementierung bereitgestellt.
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.