Başvuru dönüş değerleri için destek (Visual Basic)

C# 7,0 ile başlayarak, C# dili Başvuru dönüş değerlerini destekler. Başvuru dönüş değerlerini anlamanın bir yolu, bir yönteme başvuruya göre geçirilen bağımsız değişkenlerin tersidir. Başvuruya göre geçirilen bir bağımsız değişken değiştirildiğinde, değişiklikler çağıranın değişkeninin değerine yansıtılır. Bir yöntem bir çağırana bir başvuru dönüş değeri sağlıyorsa, çağıran tarafından başvuru dönüş değeri yapılan değişiklikler çağrılan metodun verilerinde yansıtılır.

Visual Basic, başvuru dönüş değerleri olan yöntemler yazmanıza izin vermez, ancak başvuru dönüş değerlerini kullanmanıza izin verir. Diğer bir deyişle, başvuru dönüş değeri olan bir yöntemi çağırabilir ve bu dönüş değerini değiştirebilir ve başvuru dönüş değerindeki değişiklikler çağrılan metodun verilerinde yansıtılır.

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

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

Aşağıdaki C# örneği, bir NumericValue.IncrementValue iç değeri artıran ve 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şağıdaki Visual Basic örneğinde çağıran tarafından değiştirilir. NumericValue.IncrementValueYöntem çağrısını içeren satırın yöntemine bir değer atamayacağı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öntemi kullanma

Diğer durumlarda, doğrudan yöntem çağrısının başvuru dönüş değerini değiştirmek her zaman istenmeyebilir. Örneğin, bir dize döndüren arama yöntemi her zaman bir eşleşme bulmayabilir. 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 sınıfı tanımlar, belirtilen bir alt Sentence FindNext dizeyle başlayan bir tümcede bulunan sonraki kelimeyi bulan bir yöntemi içerir. Dize bir başvuru dönüş değeri olarak döndürülür ve Boolean yöntemine başvuruya göre geçirilen bir değişken aramanın başarılı olup olmadığını gösterir. Başvuru dönüş değeri, döndürülen değeri okumayla ilgili ek olarak, çağıranın da değiştiremeyeceğini ve bu değişikliğin sınıfta dahili olarak bulunan verilere yansıtıldığını gösterir 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();
    }
}

Bu durumda başvuru dönüş değerini doğrudan değiştirmek güvenilir değildir, çünkü Yöntem çağrısı bir eşleşme bulamamasına ve tümcedeki ilk sözcüğü döndürmeyebilir. Bu durumda, çağıran, tümcenin ilk sözcüğünü yanlışlıkla değiştirmeyecektir. Bu, çağıran tarafından null (veya Visual Basic) döndürülürken engellenebilir Nothing . Ancak bu durumda, değeri bir olan bir dizeyi değiştirme girişimi Nothing NullReferenceException . Çağıran tarafından da engellenebilir String.Empty , ancak bu, çağıranın değeri olan bir dize değişkeni tanımlamasına gerek duyar String.Empty . Çağıran bu dizeyi değiştire, ancak değiştirilen dizenin sınıf tarafından depolanan tümcedeki sözcüklerle hiçbir ilişkisi olmadığından, değişikliğin kendisi bir amaca hizmet eder Sentence .

Bu senaryoyu işlemenin en iyi yolu, başvuru dönüş değerini bir yardımcı yönteme başvuruya göre geçirmektir. Yardımcı yöntemi daha sonra yöntem çağrısının başarılı olup olmadığını ve başvuru dönüş değerini değiştirmek için bir 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.