Partager via


Prise en charge des valeurs de retour de référence (Visual Basic)

Le langage C# prend en charge les valeurs de retour de référence. Une façon de comprendre les valeurs de retour de référence est qu’elles sont l’opposé des arguments passés par référence à une méthode. Lorsqu’un argument passé par référence est modifié, les modifications sont reflétées dans la valeur de la variable sur l’appelant. Lorsqu’une méthode fournit une valeur de retour de référence à un appelant, les modifications apportées à la valeur de retour de référence par l’appelant sont reflétées dans les données de la méthode appelée.

Visual Basic ne vous autorise pas à créer des méthodes avec des valeurs de retour de référence, mais vous permet d’utiliser ces valeurs. En d’autres termes, vous pouvez appeler une méthode avec une valeur de retour de référence et modifier cette valeur de retour, et les modifications apportées à la valeur de retour de référence sont reflétées dans les données de la méthode appelée.

Modification directe de la valeur de retour de référence

Vous pouvez modifier directement la valeur de retour de référence pour les méthodes qui réussissent toujours et n’ont aucun paramètre ByRef. Pour ce faire, attribuez la nouvelle valeur aux expressions qui renvoient la valeur de retour de référence.

L’exemple C# suivant définit une méthode NumericValue.IncrementValue qui incrémente une valeur interne et la retourne comme valeur de retour de référence.

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

La valeur de retour de référence est ensuite modifiée par l’appelant dans l’exemple Visual Basic suivant. Notez que la ligne avec l’appel de méthode NumericValue.IncrementValue n’attribue pas de valeur à la méthode. Au lieu de cela, elle attribue une valeur à la valeur de retour de référence renvoyée par la méthode.

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

Utilisation d’une méthode d’assistance

Dans d'autres cas, il n'est pas toujours souhaitable de modifier directement la valeur de retour de référence d'un appel de méthode. Par exemple, une méthode de recherche qui renvoie une chaîne peut ne pas toujours trouver une correspondance. Dans ce cas, vous souhaitez modifier la valeur de retour de référence uniquement si la recherche réussit.

L’exemple C# suivant illustre ce scénario. Il définit une classe Sentence écrite en C# qui inclut une méthode FindNext qui recherche le mot suivant dans une phrase qui commence par une sous-chaîne spécifiée. La chaîne est retournée comme valeur de retour de référence et une variable Boolean passée par référence à la méthode indique si la recherche a réussi. La valeur de retour de référence indique qu’en plus de lire la valeur renvoyée, l’appelant peut également la modifier, et cette modification est reflétée dans les données contenues en interne dans la classe 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();
    }
}

La modification directe de la valeur de retour de référence dans ce cas n’est pas fiable, car l’appel de méthode peut ne pas trouver de correspondance et renvoyer le premier mot dans la phrase. Dans ce cas, l'appelant modifiera par inadvertance le premier mot de la phrase. Cela peut être empêché si l’appelant renvoie un null (ou Nothing en Visual Basic). Mais dans ce cas, la tentative de modification d’une chaîne dont la valeur est Nothing lève un NullReferenceException. Cela peut également être empêché si l’appelant renvoie String.Empty, mais cela nécessite que l’appelant définisse une variable de chaîne dont la valeur est String.Empty. Bien que l’appelant puisse modifier cette chaîne, la modification elle-même est inutile, car la chaîne modifiée n’a aucune relation avec les mots de la phrase stockée par la classe Sentence.

La meilleure façon de gérer ce scénario consiste à passer la valeur de retour de référence par référence à une méthode d’assistance. La méthode d'assistance contient alors la logique permettant de déterminer si l'appel de méthode a réussi et, le cas échéant, de modifier la valeur de retour de référence. L’exemple suivant fournit une implémentation possible.

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.

Voir aussi