Delen via


Ondersteuning voor referentie-retourwaarden (Visual Basic)

De C#-taal ondersteunt referentie-retourwaarden. Een manier om te begrijpen wat de retourwaarden voor verwijzingen zijn, is dat ze het tegenovergestelde zijn van argumenten die worden doorgegeven door verwijzing naar een methode. Wanneer een argument dat wordt doorgegeven door verwijzing wordt gewijzigd, worden de wijzigingen doorgevoerd in de waarde van de variabele in de aanroeper. Wanneer een methode een retourwaarde naar een aanroeper levert, worden wijzigingen die door de aanroeper zijn aangebracht, doorgevoerd in de gegevens van de aangeroepen methode.

Visual Basic staat u niet toe om methoden te ontwerpen met referentie-retourwaarden, maar hiermee kunt u wel referentie-retourwaarden gebruiken. Met andere woorden, u kunt een methode aanroepen met een retourwaarde van een verwijzing en die retourwaarde wijzigen, en wijzigingen in de geretourneerde verwijzingswaarde worden weerspiegeld in de gegevens van de aangeroepen methode.

De retourwaarde voor verw rechtstreeks wijzigen

Voor methoden die altijd slagen en geen ByRef parameters hebben, kunt u de retourwaarde van de verwijzing rechtstreeks wijzigen. U doet dit door de nieuwe waarde toe te wijzen aan de expressies die de retourwaarde van de verwijzing retourneren.

In het volgende C#-voorbeeld wordt een NumericValue.IncrementValue methode gedefinieerd waarmee een interne waarde wordt verhoogd en geretourneerd als een referentie-retourwaarde.

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

De retourwaarde van de verwijzing wordt vervolgens gewijzigd door de aanroeper in het volgende Visual Basic-voorbeeld. Houd er rekening mee dat de regel met de NumericValue.IncrementValue methode-aanroep geen waarde aan de methode toewijst. In plaats daarvan wordt een waarde toegewezen aan de geretourneerde verwijzingswaarde die door de methode wordt geretourneerd.

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

Een helpermethode gebruiken

In andere gevallen is het wijzigen van de referentie-retourwaarde van een methode-aanroep mogelijk niet altijd wenselijk. Een zoekmethode die een tekenreeks retourneert, kan bijvoorbeeld niet altijd een overeenkomst vinden. In dat geval wilt u de retourwaarde van de verwijzing alleen wijzigen als de zoekopdracht is geslaagd.

In het volgende C#-voorbeeld ziet u dit scenario. Het definieert een Sentence klasse die in C# is geschreven, bevat een FindNext methode waarmee het volgende woord wordt gevonden in een zin die begint met een opgegeven subtekenreeks. De tekenreeks wordt geretourneerd als een retourwaarde voor verwijzingen en een Boolean variabele die wordt doorgegeven aan de methode, geeft aan of de zoekopdracht is geslaagd. De retourwaarde van de verwijzing geeft aan dat naast het lezen van de geretourneerde waarde, de aanroeper deze ook kan wijzigen en die wijziging wordt weerspiegeld in de gegevens die intern in de Sentence klasse zijn opgenomen.

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

Het rechtstreeks wijzigen van de retourwaarde van de verwijzing in dit geval is niet betrouwbaar, omdat de methode-aanroep een overeenkomst kan vinden en het eerste woord in de zin kan retourneren. In dat geval wijzigt de beller per ongeluk het eerste woord van de zin. Dit kan worden voorkomen door de beller die een null (of Nothing in Visual Basic) retourneert. Maar in dat geval probeert u een tekenreeks te wijzigen waarvan de waarde Nothing een NullReferenceException. Als dit ook kan worden voorkomen door de beller die terugkeert String.Empty, maar dit vereist dat de aanroeper een tekenreeksvariabele definieert waarvan de waarde is String.Empty. Hoewel de aanroeper deze tekenreeks kan wijzigen, heeft de wijziging zelf geen doel, omdat de gewijzigde tekenreeks geen relatie heeft met de woorden in de zin die door de Sentence klasse is opgeslagen.

De beste manier om dit scenario af te handelen, is door de retourwaarde van de verwijzing door te geven aan een helpermethode. De helpermethode bevat vervolgens de logica om te bepalen of de aanroep van de methode is geslaagd en, als dat wel het is gedaan, om de retourwaarde van de verwijzing te wijzigen. In het volgende voorbeeld ziet u een mogelijke implementatie.

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.

Zie ook