Aracılığıyla paylaş


Başvuru dönüş değerleri desteği (Visual Basic)

C# dili başvuru dönüş değerlerini destekler. Başvuru dönüş değerlerini anlamanın bir yolu, bir yönteme başvuru ile geçirilen bağımsız değişkenlerin tersi olmasıdır. Başvuru tarafından geçirilen bir bağımsız değişken değiştirildiğinde, değişiklikler çağırandaki değişkenin değerine yansıtılır. Bir yöntem çağırana başvuru dönüş değeri sağladığında, çağıran tarafından başvuru dönüş değerinde yapılan değişiklikler çağrılan yöntemin verilerine yansıtılır.

Visual Basic, başvuru dönüş değerlerine sahip yöntemler yazmanıza izin vermez, ancak başvuru dönüş değerlerini kullanmanıza olanak sağlar. Başka bir deyişle, başvuru dönüş değeri olan bir yöntemi çağırabilir ve bu dönüş değerini değiştirebilirsiniz ve başvuru dönüş değerindeki değişiklikler çağrılan yöntemin verilerine yansıtılır.

Başv dönüş değerini doğrudan değiştirme

Her zaman başarılı olan ve parametresi olmayan ByRef yöntemler için, başvuru dönüş değerini doğrudan değiştirebilirsiniz. Bunu, yeni değeri başvuru dönüş değerini döndüren ifadelere atayarak yaparsınız.

Aşağıdaki C# örneği, bir NumericValue.IncrementValue iç değeri artıran ve bunu başvuru dönüş değeri olarak döndüren bir yöntemi tanımlar.

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

Başvuru dönüş değeri daha sonra çağıran tarafından aşağıdaki Visual Basic örneğinde değiştirilir. Yöntem çağrısına sahip satırın NumericValue.IncrementValue yönteme bir değer atamadığını unutmayın. Bunun yerine, yöntemi tarafından döndürülen başvuru dönüş değerine bir değer atar.

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

Yardımcı yöntem kullanma

Diğer durumlarda, bir yöntem çağrısının başvuru dönüş değerinin doğrudan değiştirilmesi her zaman istenmeyebilir. Örneğin, dize döndüren bir arama yöntemi her zaman eşleşme bulamayabilir. Bu durumda, başvuru dönüş değerini yalnızca arama başarılı olursa değiştirmek istersiniz.

Aşağıdaki C# örneği bu senaryoyu göstermektedir. C# dilinde yazılmış bir Sentence sınıfı tanımlar, belirtilen bir FindNext alt dize ile başlayan bir tümcede sonraki sözcüğü bulan bir yöntem içerir. Dize bir başvuru dönüş değeri olarak döndürülür ve yöntemine başvuru tarafından geçirilen bir Boolean değişken, aramanın başarılı olup olmadığını gösterir. Başvuru dönüş değeri, döndürülen değerin okunmasının yanı sıra çağıranın da bunu değiştirebileceğini ve değişikliğin sınıfta dahili olarak Sentence bulunan verilere yansıtıldığını gösterir.

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

Yöntem çağrısı eşleşme bulamayabilir ve cümledeki ilk sözcüğü döndürebileceğinden, bu durumda başvuru dönüş değerini doğrudan değiştirmek güvenilir değildir. Bu durumda, arayan istemeden cümlenin ilk sözcüğünü değiştirir. Çağıranın (veya Nothing Visual Basic'te) döndürmesi null bu durum önlenebilir. Ancak bu durumda, değeri Nothing olan bir dizeyi değiştirmeye çalışmak bir NullReferenceExceptionoluşturur. Çağıranın döndürerek String.Emptyde engellenebilirse, ancak bunun için çağıranın değeri olan bir dize değişkeni tanımlaması String.Emptygerekir. Çağıran bu dizeyi değiştirebildiğinden, değiştirilen dizenin sınıfı tarafından depolanan cümledeki sözcüklerle hiçbir ilişkisi olmadığından, değişikliğin Sentence kendisi hiçbir amaca hizmet etmez.

Bu senaryoyu işlemenin en iyi yolu, başvuru dönüş değerini bir yardımcı yöntemine başvurarak geçirmektir. Yardımcı yöntemi daha sonra yöntem çağrısının başarılı olup olmadığını saptamak ve başarılı olduysa başvuru dönüş değerini değiştirmek için mantığı içerir. Aşağıdaki örnek olası bir uygulama sağlar.

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.

Ayrıca bkz.