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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk