Visual Basic'de yöntemlerin parametreleri referans (ByRef) veya değer (ByVal) ile aktarılabilir. Bu, prosedür içindeki değişikliklerin prosedür dışındaki orijinal değişkeni etkileyip etkilemeyeceğini etkiler.
Meselenin Tarihi:
VB.NET'de parametreler varsayılan olarak değer ile (ByVal) aktarılır, bu da değerin bir kopyasının iletilmesi anlamına gelir. ByRef ile, kopya değil, orijinal değişkenin referansı iletilir.
Sorun:
Yanlış aktarma yöntemi kullanımı hatalara yol açar — örneğin, ByRef yanlış kullanıldığında, yöntem çağıran kodun değişkenlerini istemeden değiştirebilir veya tersine, değişiklikler kaydedilmeyebilir.
Çözüm:
ByRef, birden fazla değer döndürmek veya bir değişkeni değiştirmek gerektiğinde kullanılır. ByVal ise istenmeyen değişikliklerden korumak için diğer tüm durumlarda kullanılır. ByRef'i yalnızca gerekli olduğunda açıkça belirtmek son derece önemlidir.
Değer ile ve referans ile aktarma örneği:
Sub DoubleValue(ByVal x As Integer) x = x * 2 End Sub Sub DoubleValueByRef(ByRef x As Integer) x = x * 2 End Sub Dim a As Integer = 5 DoubleValue(a) ' a hala 5 DoubleValueByRef(a) ' a artık 10 oldu
Anahtar özellikler:
ByRef ile nesne aktarıldığında ne olur: nesne referansı değişir mi?
Cevap: Eğer nesneyi ByRef ile aktarıp prosedür içinde bir yeni nesne atarsanız, prosedür dışındaki orijinal değişken de yeni nesneye işaret edecektir. ByVal ile aktarırken, nesnenin özelliklerini değiştirebilirsiniz, ancak referansı değiştiremezsiniz — prosedür dışındaki değişken aynı kalır.
Sub ChangeRef(ByRef p As Person) p = New Person() With {.Name = "Diğer"} End Sub Sub ChangeVal(ByVal p As Person) p.Name = "Değiştirildi" End Sub Dim pers As New Person With {.Name = "Orijinal"} ChangeRef(pers) ' pers artık yeni nesne ChangeVal(pers) ' pers — aynı nesne, ismi değiştirildi
Function'dan değer döndürmek için ByRef kullanılabilir mi?
Cevap: Hayır, ByRef yalnızca parametrelerin aktarımında belirtilir, fonksiyonun döndürdüğü değer için değil.
Bir dizi argümanını ByVal ile tanımlarsak — dizi içeriğini değiştirebilir miyiz?
Cevap: Evet, çünkü VB.NET'de dizi referans tipi olduğu için, ByVal ile aktarımda referansın kendisi kopyalanır, ancak dizi elemanları (aynı referansla) prosedür içinde değiştirilebilir.
Bir ekipte, bir geliştirici işlemede ByRef kullandı ve programın bir bölümündeki değerin değiştirilmesi, bir değişkenin durumunu beklenmedik şekilde değiştirdi, bu da modülün doğru çalışmamasına neden oldu.
Artılar: Verileri döndürülen değer yapısını belirtmeden değiştirme olanağı
Eksiler: Görünmeyen yan etkiler yüksek riski, hataları ayıklamak zor
Parametreler ByVal ile aktarılır ve birden fazla değer döndürme, döndürülen yapılar veya Tuple ile yapılır, bu da davranışı net ve rahat hale getirir.
Artılar: Kodu okumak ve sürdürmek daha kolay, daha az hata
Eksiler: Bazen ek türler veya yapıların oluşturulması gerekebilir