Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il linguaggio C# supporta valori restituiti di riferimento. Un modo per comprendere i valori di ritorno per riferimento è considerare che sono l'opposto degli argomenti che vengono passati per riferimento a un metodo. Quando viene modificato un argomento passato per riferimento, le modifiche vengono riflesse nel valore della variabile sul chiamante. Quando un metodo fornisce un valore restituito di riferimento a un chiamante, le modifiche apportate al valore restituito di riferimento dal chiamante vengono riflesse nei dati del metodo chiamato.
Visual Basic non consente di creare metodi con valori restituiti di riferimento, ma consente di utilizzare valori restituiti di riferimento. In altre parole, è possibile chiamare un metodo con un valore restituito di riferimento e modificare tale valore restituito e le modifiche apportate al valore restituito di riferimento vengono riflesse nei dati del metodo chiamato.
Modifica diretta del valore restituito ref
Per i metodi che hanno sempre esito positivo e non hanno parametri ByRef, è possibile modificare direttamente il valore di ritorno del riferimento. Si fa assegnando il nuovo valore alle espressioni che restituiscono il valore di ritorno del riferimento.
L'esempio C# seguente definisce un metodo che incrementa un NumericValue.IncrementValue valore interno e lo restituisce come valore restituito di riferimento.
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;
}
}
Il valore restituito del riferimento viene quindi modificato dal chiamante nell'esempio di Visual Basic seguente. Si noti che la riga con la chiamata al NumericValue.IncrementValue metodo non assegna un valore al metodo . Invece, assegna un valore alla variabile di riferimento restituita dal metodo.
Module Example
Public Sub Main()
Dim n As New NumericValue(15)
n.IncrementValue() += 12
Console.WriteLine(n.GetValue)
End Sub
End Module
' Output: 28
Uso di un metodo helper
In altri casi, la modifica del valore restituito di riferimento di una chiamata al metodo direttamente potrebbe non essere sempre auspicabile. Ad esempio, un metodo di ricerca che restituisce una stringa potrebbe non sempre trovare una corrispondenza. In tal caso, si vuole modificare il valore restituito del riferimento solo se la ricerca ha esito positivo.
L'esempio C# seguente illustra questo scenario. Definisce una Sentence classe scritta in C# include un FindNext metodo che trova la parola successiva in una frase che inizia con una sottostringa specificata. La stringa viene restituita come valore restituito di riferimento e una Boolean variabile passata per riferimento al metodo indica se la ricerca ha avuto esito positivo. Il valore restituito del riferimento indica che, oltre a leggere il valore restituito, il chiamante può anche modificarlo e tale modifica viene riflessa nei dati contenuti internamente nella Sentence classe .
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();
}
}
La modifica diretta del valore restituito di riferimento in questo caso non è affidabile, poiché la chiamata al metodo potrebbe non riuscire a trovare una corrispondenza e restituire la prima parola nella frase. In tal caso, il chiamante modificherà inavvertitamente la prima parola della frase. Ciò potrebbe essere impedito dal chiamante che restituisce un valore (null o Nothing in Visual Basic). Tuttavia, in tal caso, il tentativo di modificare una stringa il cui valore è Nothing genera un'eccezione NullReferenceException. Potrebbe anche essere impedito se il chiamante restituisse String.Empty, ma è necessario che il chiamante definisca una variabile stringa il cui valore sia String.Empty. Anche se il chiamante può modificare tale stringa, la modifica stessa non ha alcun scopo, poiché la stringa modificata non ha alcuna relazione con le parole nella frase archiviata Sentence dalla classe .
Il modo migliore per gestire questo scenario consiste nel passare il valore di ritorno del riferimento a un metodo di supporto. Il metodo helper contiene quindi la logica per determinare se la chiamata al metodo ha avuto esito positivo e, in caso affermativo, per modificare il valore restituito del riferimento. Nell'esempio seguente viene fornita una possibile implementazione.
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.