Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.