Objek tidak lulus sama sekali. Secara default, argumen dievaluasi dan nilainya diteruskan, berdasarkan nilai, sebagai nilai awal dari parameter metode yang Anda panggil. Sekarang poin penting adalah bahwa nilainya adalah referensi untuk tipe referensi - cara untuk sampai ke objek (atau nol). Perubahan pada objek itu akan terlihat dari pemanggil. Namun, mengubah nilai parameter untuk merujuk ke objek yang berbeda tidak akan terlihat ketika Anda menggunakan nilai by pass, yang merupakan default untuk semua jenis.
Jika Anda ingin menggunakan pass-by-reference, Anda harus menggunakan out
atau ref
, apakah tipe parameter adalah tipe nilai atau tipe referensi. Dalam hal itu, secara efektif variabel itu sendiri dilewatkan oleh referensi, sehingga parameter menggunakan lokasi penyimpanan yang sama dengan argumen - dan perubahan pada parameter itu sendiri dilihat oleh pemanggil.
Begitu:
public void Foo(Image image)
{
// This change won't be seen by the caller: it's changing the value
// of the parameter.
image = Image.FromStream(...);
}
public void Foo(ref Image image)
{
// This change *will* be seen by the caller: it's changing the value
// of the parameter, but we're using pass by reference
image = Image.FromStream(...);
}
public void Foo(Image image)
{
// This change *will* be seen by the caller: it's changing the data
// within the object that the parameter value refers to.
image.RotateFlip(...);
}
Saya punya artikel yang jauh lebih detail dalam hal ini . Pada dasarnya, "lulus dengan referensi" tidak berarti apa yang Anda pikirkan artinya.