Megosztás a következőn keresztül:


Referencia-visszatérési értékek támogatása (Visual Basic)

A C#-nyelv támogatja a referencia visszatérési értékeit. A hivatkozási visszatérési értékek megértésének egyik módja, hogy azok az argumentumok ellentétei, amelyeket egy metódusra való hivatkozással adnak át. A hivatkozás által átadott argumentum módosításakor a változások a hívó változó értékében jelennek meg. Ha egy metódus hivatkozási visszatérési értéket ad a hívónak, a hívó által végrehajtott referencia-visszatérési érték módosításai megjelennek a hívott metódus adataiban.

A Visual Basic nem teszi lehetővé, hogy hivatkozási visszatérési értékekkel rendelkező metódusokat szerkesszen, de lehetővé teszi a hivatkozási visszatérési értékek használatát. Más szóval meghívhat egy hivatkozási visszatérési értékkel rendelkező metódust, és módosíthatja a visszatérési értéket, és a hivatkozási visszatérési érték módosításai megjelennek az úgynevezett metódus adataiban.

A hiv visszatérési értékének módosítása közvetlenül

Az olyan metódusok esetében, amelyek mindig sikeresek, és nem ByRef rendelkeznek paraméterekkel, közvetlenül módosíthatja a referencia-visszatérési értéket. Ezt úgy teheti meg, hogy hozzárendeli az új értéket a referencia-visszatérési értéket visszaadó kifejezésekhez.

Az alábbi C#-példa egy NumericValue.IncrementValue belső értéket növekményes és referencia-visszatérési értékként visszaadó metódust határoz meg.

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

Ezt követően a hívó módosítja a referencia-visszatérési értéket a következő Visual Basic-példában. Vegye figyelembe, hogy a metódushívást tartalmazó NumericValue.IncrementValue sor nem rendel értéket a metódushoz. Ehelyett egy értéket rendel a metódus által visszaadott referencia-visszatérési értékhez.

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

Segédmetódus használata

Más esetekben előfordulhat, hogy egy metódushívás referencia-visszatérési értékének közvetlen módosítása nem mindig kívánatos. Előfordulhat például, hogy egy sztringet visszaadó keresési módszer nem mindig talál egyezést. Ebben az esetben csak akkor szeretné módosítani a hivatkozás visszatérési értékét, ha a keresés sikeres.

A következő C#-példa ezt a forgatókönyvet szemlélteti. A C#-ban írt osztály definiál egy Sentence metódust FindNext , amely megkeresi a következő szót egy adott részszúrással kezdődő mondatban. A sztring hivatkozási visszatérési értékként lesz visszaadva, és a Boolean metódusra hivatkozva átadott változó jelzi, hogy a keresés sikeres volt-e. A referencia visszatérési értéke azt jelzi, hogy a visszaadott érték olvasása mellett a hívó is módosíthatja azt, és hogy a módosítás az osztály belső adataiban Sentence is tükröződik.

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

A hivatkozás visszatérési értékének közvetlen módosítása ebben az esetben nem megbízható, mivel előfordulhat, hogy a metódushívás nem talál egyezést, és visszaadja a mondat első szavát. Ebben az esetben a hívó véletlenül módosítja a mondat első szavát. Ezt megakadályozhatja, ha a hívó egy (vagy Nothing Visual Basic) értéket ad null vissza. Ebben az esetben azonban megpróbál módosítani egy sztringet, amelynek értéke Nothing egy NullReferenceException. Ha a hívó is String.Emptymeg tudja akadályozni, de ehhez meg kell határoznia egy sztringváltozót, amelynek értéke .String.Empty Bár a hívó módosíthatja ezt a sztringet, maga a módosítás nem szolgál célként, mivel a módosított sztringnek nincs kapcsolata az osztály által Sentence tárolt mondatban lévő szavakkal.

Ennek a forgatókönyvnek a legjobb módja, ha egy segédmetódusra hivatkozva adja át a referencia visszatérési értékét. A segédmetódus ezután tartalmazza a logikát annak megállapításához, hogy a metódushívás sikeres volt-e, és ha igen, a hivatkozás visszatérési értékének módosításához. Az alábbi példa egy lehetséges megvalósítást mutat be.

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.

Lásd még