Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Język C# obsługuje wartości zwrotne przez referencję. Jednym ze sposobów zrozumienia wartości zwracanych odwołań jest to, że są one przeciwieństwem argumentów przekazywanych przez odwołanie do metody. Po zmodyfikowaniu argumentu przekazanego przez odwołanie zmiany są odzwierciedlane w wartości zmiennej obiektu wywołującego. Gdy metoda dostarcza obiektowi wywołującemu wartość zwracaną w postaci odwołania, modyfikacje dokonane na tej wartości przez obiekt wywołujący są odzwierciedlane w danych metody wywoływanej.
Visual Basic nie zezwala na tworzenie metod zwracających referencje, ale umożliwia korzystanie z wartości zwracanych referencjami. Innymi słowy, można wywołać metodę z wartością zwracaną odwołania i zmodyfikować tę wartość zwracaną, a zmiany w wartości zwracanej odwołania są odzwierciedlane w danych wywoływanej metody.
Bezpośrednie modyfikowanie wartości zwracanej ref
W przypadku metod, które zawsze się udają i nie mają ByRef parametrów, można bezpośrednio zmodyfikować wartość zwracaną przez referencję. W tym celu należy przypisać nową wartość do wyrażeń, które zwracają wartość zwracaną przez odwołanie.
Poniższy przykład w języku C# definiuje metodę NumericValue.IncrementValue , która zwiększa wartość wewnętrzną i zwraca ją jako wartość zwracaną przez odwołanie.
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;
}
}
Wartość referencyjna jest następnie modyfikowana przez wywołującego w poniższym przykładzie w języku Visual Basic. Należy pamiętać, że wiersz z NumericValue.IncrementValue wywołaniem metody nie przypisuje wartości do metody . Zamiast tego przypisuje wartość do wartości zwrotnej odniesienia zwróconej przez metodę.
Module Example
Public Sub Main()
Dim n As New NumericValue(15)
n.IncrementValue() += 12
Console.WriteLine(n.GetValue)
End Sub
End Module
' Output: 28
Używanie metody pomocniczej
W innych przypadkach bezpośrednie modyfikowanie wartości zwracanej jako odwołanie wywołania metody może nie zawsze być pożądane. Na przykład metoda wyszukiwania zwracająca ciąg może nie zawsze znajdować dopasowanie. W takim przypadku chcesz zmodyfikować wartość zwrotną odniesienia tylko wtedy, gdy wyszukiwanie zakończy się pomyślnie.
Poniższy przykład w języku C# ilustruje ten scenariusz. Definiuje klasę Sentence napisaną w języku C#, która zawiera metodę FindNext, znajdującą następne słowo w zdaniu, które rozpoczyna się od określonego podciągu. Ciąg jest zwracany jako wartość zwracana przez odwołanie, a Boolean zmienna przekazana przez odwołanie do metody wskazuje, czy wyszukiwanie zakończyło się pomyślnie. Wartość zwrotna odwołania wskazuje, że oprócz odczytywania zwróconej wartości obiekt wywołujący może ją również modyfikować, a zmiana ta znajduje odzwierciedlenie w danych wewnętrznych zawartych w klasie Sentence.
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();
}
}
Bezpośrednie modyfikowanie wartości zwracanej odwołania w tym przypadku nie jest wiarygodne, ponieważ wywołanie metody może nie odnaleźć dopasowania i zwrócić pierwsze słowo w zdaniu. W takim przypadku dzwoniący przypadkowo zmodyfikuje pierwsze słowo zdania. Zjawisku temu można zapobiec, jeśli wywołujący zwróci null (lub Nothing w Visual Basic). Jednak w takim przypadku próba zmodyfikowania ciągu, którego wartość jest Nothing zgłaszana jako NullReferenceException. Jeśli można również zapobiec zwracaniu String.Emptyprzez obiekt wywołujący , ale wymaga to, aby obiekt wywołujący zdefiniował zmienną ciągu, której wartością jest String.Empty. Chociaż obiekt wywołujący może zmodyfikować ten ciąg, sama modyfikacja nie służy żadnemu celowi, ponieważ zmodyfikowany ciąg nie ma relacji ze słowami w zdaniu przechowywanym przez klasę Sentence .
Najlepszym sposobem obsługi tego scenariusza jest przekazanie zwracanej wartości referencyjnej w referencji do metody pomocniczej. Metoda pomocnika zawiera logikę, która określa, czy wywołanie metody się powiodło, a jeśli tak, pozwala na zmianę zwracanej wartości referencji. W poniższym przykładzie przedstawiono możliwą implementację.
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.