Dukungan untuk nilai pengembalian referensi (Visual Basic)

Bahasa C# mendukung nilai pengembalian referensi. Salah satu cara untuk memahami nilai pengembalian referensi adalah mereka merupakan kebalikan dari argumen yang diteruskan oleh referensi ke metode. Ketika argumen yang diteruskan oleh referensi dimodifikasi, perubahan tercermin dalam nilai variabel pada pemanggil. Saat metode menyediakan nilai pengembalian referensi kepada pemanggil, modifikasi yang dilakukan pada nilai pengembalian referensi oleh pemanggil tercermin dalam data metode yang disebut.

Visual Basic tidak memungkinkan Anda untuk menulis metode dengan nilai pengembalian referensi, tetapi memungkinkan Anda untuk menggunakan nilai pengembalian referensi. Dengan kata lain, Anda dapat memanggil metode dengan nilai pengembalian referensi dan memodifikasi nilai pengembalian tersebut, dan perubahan pada nilai pengembalian referensi tercermin dalam data metode yang disebut.

Memodifikasi nilai pengembalian ref secara langsung

Untuk metode yang selalu berhasil dan tidak ByRef memiliki parameter, Anda dapat memodifikasi nilai pengembalian referensi secara langsung. Anda melakukan ini dengan menetapkan nilai baru ke ekspresi yang mengembalikan nilai pengembalian referensi.

Contoh C# berikut mendefinisikan NumericValue.IncrementValue metode yang menaikkan nilai internal dan mengembalikannya sebagai nilai pengembalian referensi.

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

Nilai pengembalian referensi kemudian dimodifikasi oleh pemanggil dalam contoh Visual Basic berikut. Perhatikan bahwa baris dengan NumericValue.IncrementValue panggilan metode tidak menetapkan nilai ke metode. Sebaliknya, ia menetapkan nilai ke nilai pengembalian referensi yang dikembalikan oleh metode.

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

Menggunakan metode pembantu

Dalam kasus lain, memodifikasi nilai pengembalian referensi dari panggilan metode secara langsung mungkin tidak selalu diinginkan. Misalnya, metode pencarian yang mengembalikan string mungkin tidak selalu menemukan kecocokan. Dalam hal ini, Anda ingin mengubah nilai pengembalian referensi hanya jika pencarian berhasil.

Contoh C# berikut mengilustrasikan skenario ini. Ini mendefinisikan kelas Sentence yang ditulis dalam C# menyertakan metode FindNext yang menemukan kata berikutnya dalam kalimat yang dimulai dengan substring tertentu. String dikembalikan sebagai nilai pengembalian referensi, dan variabel Boolean yang diteruskan oleh referensi ke metode menunjukkan apakah pencarian berhasil. Nilai pengembalian referensi menunjukkan bahwa selain membaca nilai yang dikembalikan, pemanggil juga dapat memodifikasinya, dan modifikasi tersebut tercermin dalam data yang terkandung secara internal di Sentence kelas.

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

Memodifikasi nilai pengembalian referensi secara langsung dalam kasus ini tidak dapat diandalkan, karena panggilan metode mungkin gagal menemukan kecocokan dan mengembalikan kata pertama dalam kalimat. Dalam hal ini, pemanggil secara tidak sengaja akan memodifikasi kata pertama kalimat. Ini dapat dicegah oleh pemanggil yang mengembalikan null (atau Nothing dalam Visual Basic). Tetapi dalam hal ini, mencoba memodifikasi string yang nilainya Nothing melempar NullReferenceException. Jika juga dapat dicegah oleh pemanggil yang mengembalikan String.Empty, tetapi ini mengharuskan pemanggil menentukan variabel string yang nilainya adalah String.Empty. Meskipun pemanggil dapat memodifikasi string tersebut, modifikasi itu sendiri tidak memiliki tujuan, karena string yang dimodifikasi tidak memiliki hubungan dengan kata-kata dalam kalimat yang disimpan oleh Sentence kelas.

Cara terbaik untuk menangani skenario ini adalah dengan meneruskan nilai pengembalian referensi dengan referensi ke metode pembantu. Metode pembantu kemudian berisi logika untuk menentukan apakah panggilan metode berhasil dan, jika berhasil, untuk memodifikasi nilai pengembalian referensi. Contoh berikut memberikan kemungkinan implementasi.

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.

Lihat juga