Pass a ref
jika Anda ingin mengubah objek itu:
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
Setelah memanggil DoSomething, t
tidak merujuk ke yang asli new TestRef
, tetapi merujuk ke objek yang sama sekali berbeda.
Ini mungkin berguna juga jika Anda ingin mengubah nilai objek yang tidak dapat diubah, misalnya a string
. Anda tidak dapat mengubah nilai string
setelah itu dibuat. Tetapi dengan menggunakan ref
, Anda bisa membuat fungsi yang mengubah string untuk yang lain yang memiliki nilai berbeda.
Sunting: Seperti orang lain sebutkan. Ini bukan ide yang baik untuk digunakan ref
kecuali jika diperlukan. Menggunakan ref
memberikan kebebasan metode untuk mengubah argumen untuk sesuatu yang lain, penelepon metode perlu diberi kode untuk memastikan mereka menangani kemungkinan ini.
Juga, ketika tipe parameter adalah objek, maka variabel objek selalu bertindak sebagai referensi ke objek. Ini berarti bahwa ketika ref
kata kunci digunakan, Anda punya referensi ke referensi. Ini memungkinkan Anda untuk melakukan hal-hal seperti yang dijelaskan dalam contoh yang diberikan di atas. Tetapi, ketika tipe parameter adalah nilai primitif (misalnya int
), maka jika parameter ini ditugaskan dalam metode, nilai argumen yang diteruskan akan diubah setelah metode kembali:
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}