Bagikan melalui


Dukungan untuk nilai pengembalian referensi (Visual Basic)

Bahasa C# mendukung nilai pengembalian referensi. Salah satu cara untuk memahami nilai pengembalian referensi adalah bahwa mereka berlawanan dengan argumen yang diteruskan sebagai referensi ke sebuah metode. Ketika argumen yang diteruskan melalui referensi dimodifikasi, perubahan diterapkan terhadap nilai variabel pemanggil. Ketika 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 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 memiliki parameter ByRef, Anda dapat langsung memodifikasi nilai kembalian referensi. 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 pemanggilan metode NumericValue.IncrementValue tidak mengalokasikan nilai ke dalam metode. Sebaliknya, sistem menetapkan nilai ke nilai referensi pengembalian 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# dan mengandung metode FindNext yang menemukan kata berikutnya dalam kalimat yang dimulai dengan substring tertentu. String dikembalikan sebagai nilai pengembalian referensi, dan variabel Boolean yang diteruskan sebagai 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 akan secara tidak sengaja memodifikasi kata pertama kalimat. Ini dapat dicegah jika pemanggil mengembalikan null (atau Nothing di Visual Basic). Tetapi dalam hal ini, mencoba memodifikasi string yang nilainya Nothing melempar NullReferenceException. Jika hal ini juga dapat dicegah oleh pemanggil dengan mengembalikan String.Empty, tetapi hal ini mengharuskan pemanggil untuk 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 ke metode pembantu sebagai referensi. Metode pembantu kemudian berisi logika untuk menentukan apakah panggilan metode berhasil dan, jika ya, 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