ByVal modifikatörü, bir parametrenin bir prosedüre veya fonksiyona değer olarak geçişini belirtir. Visual Basic'te ByVal varsayılan olarak uygulanır ve prosedür içinde parametre üzerinde yapılan değişikliklerin, çağıran tarafın geçirdiği orijinal değişkeni etkilememesini garanti eder.
Klasik VB sürümlerinde herhangi bir parametre iki şekilde geçilebilirdi: değerle veya referansla. Dilin gelişmesi ve karmaşık veri türlerinin (yapılar, sınıflar) ortaya çıkmasıyla ByVal ve ByRef arasında bilinçli seçim yapmanın önemi arttı.
Parametrenin geçiş yöntemiyle ilgili hatalı seçimler, çağıran kodun değişkenini istemeden değiştirme veya değişikliklerin olmayacağı beklentisi gibi hatalara yol açabilir.
ByVal, prosedürün bir değer kopyasıyla çalışması gerektiğinde kullanılır. Primitif türler, yapılar ve bazen referans türlerini geçirmek için, referansı korumak önemli olduğunda uygulanır.
Kod örneği:
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' 10 döndürecektir, 11 değil
Anahtar özellikler:
ByRef'in açık bir şekilde kullanımı, tam olarak referansla geçiş yapmak içinEğer bir nesne (örneğin, bir sınıf örneği) ByVal modifikatörü ile geçilirse, nasıl davranır?
Cevap: Nesneye ait referansın bir kopyası geçilir, nesnenin kendisi değil. Prosedürden nesnenin alanları değiştirilebilir — değişiklikler dışarıda görülebilir. Ancak, prosedür içinde referansı yeni bir nesne ile değiştirmek, çağıran kod için etkili olmaz.
Kod örneği:
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' Özelliği değiştirir! c = New Counters() ' Bu değişiklik çağıran kod tarafından görünmez End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' 999 yazdıracaktır
Eğer bir yapının alanlarını prosedür içinde değiştirirsek, ByVal ile geçiş yaptığımızda yapının değeri değişir mi?
Cevap: Hayır, yapı örneğinin tamamı kopyalanır ve değişiklikler dışarıya geçmez. Prosedürde her yapı kaydı, örneğin Point, kendi kesinliğindedir.
Parametre için ByVal'ı açıkça belirtmek zorunlu mu?
Cevap: Hayır, ByVal varsayılan olarak kullanılır, açık bir şekilde belirtmek yalnızca daha okunaklılık ve kodlama stilinin korunması için gereklidir.
Geliştirici, bir diziyi ByVal olarak bir fonksiyona geçiriyor ve dizinin unsurlarını değiştirme ve çağıran tarafın yeni bir dizi elde etme beklentisi içindedir (de facto Referans Tip bir referansla geçilir).
Artılar:
Eksiler:
Fonksiyon tarafından değiştirilmemesi gereken bir dizi indeksinin geçirilmesinde ByVal kullanılır. İndeks değeri içerde değiştirilse bile, orijinal değişken etkilenmez.
Artılar:
Eksiler: