Sorunun Tarihi:
Visual Basic'te iç içe prosedürler (local functions), VB 15.0 (Visual Studio 2017) sürümlerinden başlayarak VB.NET'te ortaya çıkmıştır; bu, bunları klasik VB6'dan ayıran bir özelliktir; çünkü VB6'da böyle bir imkan yoktu. Bu özellik, prosedürlerin içinde prosedürler tanımlamaya olanak tanır ve dilin ifadelerini genişletir, yardımcı mantığın tek bir görünüm alanında düzenlenmesini kolaylaştırır.
Sorun
Belli bir yardım mantığının yalnızca belirli bir yöntem içinde gerekli olduğu ve başka yerde gerekmeyen sık durumlar. Önceden, sınıfın özel yöntemlerini oluşturmak zorundaydık, bu da isim alanını kirletiyor ve kodda gezinmeyi zorlaştırıyordu. Ancak local functions ile de görünürlük sorunları, değişkenlere erişim hataları ve hata ayıklama zorlukları ile karşılaşmak kolaydır.
Çözüm
İç içe prosedürler, yardımcı mantığı "üst" prosedürde kapsüller ve kodun daha okunabilir olmasını sağlar, yardımcı yöntemlerin görünüm alanını sınırlar. VB.NET'te iç içe fonksiyonların tanımlanması şöyle görünür:
Sub MainProc() Dim x As Integer = 5 Dim y As Integer = 10 Console.WriteLine($"Toplam — {Add(x, y)}") Function Add(a As Integer, b As Integer) As Integer Return a + b End Function End Sub
Ana özellikler:
İç içe prosedürler Public, Friend veya Protected erişim belirleyicilerine sahip olabilir mi?
Hayır, iç içe prosedürler yalnızca "üst" prosedürlerinin görünürlük seviyesine izin vermektedir. Public/Friend/Protected olarak tanımlanamazlar ve yalnızca yerel olarak erişilebilirler.
Bir iç içe prosedürü For veya If yapısının içinde tanımlamak mümkün mü?
Hayır, yerel fonksiyonlar yalnızca yöntem (prosedür) içinde birinci seviyede tanımlanabilir, ancak iç içe bloklar (örneğin, For, If, While) içinde tanımlanamazlar.
İç içe prosedürler asenkron (Async Sub/Function) olabilir mi?
Evet, asenkron local functions tanımlanabilir; bu da yöntem içinde asenkron yürütme mantığını kapsüller:
Async Sub DoOperationsAsync() Await LocalAsync() Async Function LocalAsync() As Task Await Task.Delay(1000) Console.WriteLine("Asenkron işlem tamamlandı.") End Function End Sub
Projede fazla sayıda private yöntem kullanılması nedeniyle, local functions yerine private yöntemler kullanıldı ve bu da sınıfın arayüzünü "kirletti". Gezinme zorlaştı.
Artılar:
Eksiler:
İç mantık için yerel fonksiyonlar kullanma yaklaşımı benimsendi: tüm yardımcı işleme ana yöntemin içinde yer alıyor, kod kendini belgelemektedir, bakımı kolaydır.
Artılar:
Eksiler: