Dalam C #, saya selalu berpikir bahwa variabel non-primitif diteruskan oleh referensi dan nilai primitif diteruskan oleh nilai.
Jadi ketika melewati suatu metode objek non-primitif, apapun yang dilakukan terhadap objek dalam metode akan mempengaruhi objek yang dilewati. (C # 101 barang)
Namun, saya telah memperhatikan bahwa ketika saya melewati objek System.Drawing.Image, bahwa ini tampaknya tidak terjadi? Jika saya melewatkan objek system.drawing.image ke metode lain, dan memuat gambar ke objek itu, lalu biarkan metode itu keluar dari ruang lingkup dan kembali ke metode pemanggilan, gambar itu tidak dimuat pada objek asli?
Kenapa ini?
Jawaban:
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
atauref
, 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:
Saya punya artikel yang jauh lebih detail dalam hal ini . Pada dasarnya, "lulus dengan referensi" tidak berarti apa yang Anda pikirkan artinya.
sumber
ref
danout
dari c #, apakah boleh mengatakan bahwa c # melewati parameter dengan cara yang sama seperti java yaitu selalu dengan nilai. Apakah ada perbedaan dengan java.Satu lagi contoh kode untuk menampilkan ini:
Dan hasilnya:
sumber
Banyak jawaban bagus telah ditambahkan. Saya masih ingin berkontribusi, mungkin itu akan menjelaskan sedikit lebih banyak.
Ketika Anda melewatkan sebuah instance sebagai argumen ke metode itu melewati
copy
instance. Sekarang, jika instance yang Anda lewati adalahvalue type
(berada di dalamstack
) Anda meneruskan salinan nilai itu, jadi jika Anda memodifikasinya, itu tidak akan tercermin dalam pemanggil. Jika instance adalah tipe referensi, Anda meneruskan salinan referensi (lagi-lagi berada distack
) ke objek. Jadi Anda punya dua referensi ke objek yang sama. Keduanya dapat memodifikasi objek. Tetapi jika di dalam tubuh metode, Anda instantiate objek baru salinan referensi Anda tidak akan lagi merujuk ke objek asli, itu akan merujuk ke objek baru yang baru saja Anda buat. Jadi Anda akan memiliki 2 referensi dan 2 objek.sumber
Saya kira ini lebih jelas ketika Anda melakukannya seperti ini. Saya sarankan mengunduh LinqPad untuk menguji hal-hal seperti ini.
Dan itu seharusnya keluar
Tidak Memperbarui
Nama depan: Egli, Nama belakang: Becerra
Perbarui secara jelas
Nama depan: Favio, Nama belakang: Becerra
Perbarui secara eksplisit
Nama depan: Favio, Nama belakang: Becerra
sumber
Ketika Anda melewati
System.Drawing.Image
objek tipe ke metode Anda sebenarnya melewati salinan referensi ke objek itu.Jadi jika di dalam metode itu Anda memuat gambar baru Anda memuat menggunakan referensi baru / disalin. Anda tidak membuat perubahan dalam aslinya.
sumber
Bagaimana Anda meneruskan objek ke metode?
Apakah Anda melakukan yang baru di dalam metode untuk objek itu? Jika demikian, Anda harus menggunakannya
ref
metode.Tautan berikut memberi Anda ide yang lebih baik.
http://dotnetstep.blogspot.com/2008/09/passing-reference-type-byval-or-byref.html
sumber
Dalam Pass By Reference, Anda hanya menambahkan "ref" pada parameter fungsi dan satu hal lagi Anda harus mendeklarasikan fungsi "statis" karena main adalah statis (#
public void main(String[] args)
)!sumber