Visual Basic'te argümanları prosedürlere iki şekilde iletmek mümkündür: ByVal (değerle, kopyayla) ve ByRef (referansla, nesne veya değişkenin kendisi). Parametre ByRef olarak işaretlendiğinde, prosedür içinde yapılan herhangi bir değişiklik, prosedür dışında orijinal değişken üzerinde yansır.
ByRef kullanımı, bir fonksiyondan birden fazla sonuç döndürmeniz gerektiğinde veya büyük veri yapılarını (kopyalamadan) kullanarak performansı optimize etmeniz gerektiğinde özellikle önemlidir.
Örnek:
Sub Swap(ByRef a As Integer, ByRef b As Integer) Dim temp As Integer = a a = b b = temp End Sub Dim x As Integer = 10 Dim y As Integer = 20 Swap(x, y) ' x = 20, y = 10
Soru: "Temel veri türlerini (Integer, String) farklı akışlar arasında güvenli bir şekilde referansla iletmek mümkün mü?"
Cevap: Hayır! Akışlar arasında (ByRef) referansla değişkenler iletildiğinde veri yarışları (data races) oluşabilir, çünkü her iki prosedür değişkeni farklı zamanlarda değiştirebilir. Bu güvenli değildir ve zor tespit edilebilen hatalara yol açabilir.
Örnek:
' Çoklu iş parçacığı modunda, a ve b değerlerinin ' eşzamanlı erişim nedeniyle yanlış değiştirilmesi durumu söz konusu olabilir!
Hikaye:
Eski bir finansal üründe, birkaç modül arasında sayaçların iletilmesi için
ByRefkullanıldı. Geliştiricilerden biri, bir değişken yerine yanlışlıkla geçici bir ifadeyi referansla geçirdi. Bu, programın çökmesine neden oldu, çünkü var olmayan bir referans, başlatılmamış bir nesneyi değiştirmeye çalıştı.
Hikaye:
Mühendislik hesaplama sisteminde, bellek tasarrufu için diziler referansla iletildi. Ancak birisi yardımcı prosedür içinde diziyi değiştirdi. Bu, zor tespit edilebilir hatalara yol açtı - veriler beklenmedik bir bağlamda değişmeye başladı.
Hikaye:
Çoklu iş parçacığı veri analizörü, iş parçacıkları arasında string'lerin referansla iletimini "optimize etmeye" çalıştı. Birden fazla akıştan referansla geçiş nedeniyle öngörülemeyen arızalar meydana geldi ve senkronizasyon mekanizması bozuldu.