Etiketler

, , , ,


Lambda İfadeleri / Temsilciler

Hayatımızın vazgeçilmezleri arasına giren lambda ifadelerini, daha geniş bir tabiler “Expressions” kullanımını anlayabilmek için, temsilcileri ve bunların kullanımı iyi derece bilmeniz gerekmektedir. Satir içi fonksiyonlar (Inline Functions) olarak da bilinen lambda ifadeleri, kullanım pratiği ve artan LINQ kullanımı içersindeki inkâr edilemez önemi sayesinde, programlama tekniklerini başka bir yöne doğru geliştirmektedirler.

İlk olarak temsilci kullanımını örnekleyim. Tüm notlarım üzerinde olan örnek uygulamayı aşağıda inceleyebilirsiniz.

'''
''' FonksiyonTemsilcisi Integer tipinden bir parametre alan ve geriye Integer tipi döndüren
''' fonksiyon imzalarına sahip fonksiyonları temsil etmektedir.
''' Bu örnek uygulamada ;
'''
''' Function BirEkle(ByVal x As Integer) As Integer
''' Function BirCikar(ByVal x As Integer) As Integer
''' Function KareAl(ByVal x As Integer) As Integer
'''
''' fonksiyonlarını temsil edecektir. Görüldüğü üzere yukarıda belirtilen 3 fonksiyon da, temsilcinin
''' fonksiyon imzasını taşımaktadır.
'''
Delegate Function FonksiyonTemsilcisi(ByVal parametre1 As Integer) As Integer

''' Temsil edicek fonksiyon
Function BirEkle(ByVal x As Integer) As Integer
Return x + 1
End Function

''' Temsil edicek fonksiyon
Function BirCikar(ByVal x As Integer) As Integer
Return x - 1
End Function

''' Temsil edicek fonksiyon
Function KareAl(ByVal x As Integer) As Integer
Return x * x
End Function
''' Uygulama örneğimizi gerçekleştirdiğimiz fonksiyondur.
'''
'''

Aldığı Interger tipindeki dizi() ‘ye, temsilEdilenFonksiyon parametresi


''' ile verilen fonksiyon uygulandıktan sonra elde edilen yeni dizinin değerlerini ekrana biçimlendirilmiş olarak yazacaktır.
'''
'''
'''
''' FonksiyonTemsilcisi isimli temsilcinin temsil ettiği
''' BirEkle,BirCikar,KareAl fonksiyonlarının adresini parametre olarak alacaktır.
'''
Sub FonsiyonuUygula(ByVal dizi() As Integer, ByVal temsilEdilenFonksiyon As FonksiyonTemsilcisi, ByVal temsilEdilenFonksiyonunIsmi As String)


Dim yeniDizi(dizi.Length - 1) As Integer
For i As Integer = 0 To dizi.Length - 1
yeniDizi(i) = temsilEdilenFonksiyon(dizi(i))
Next

Console.WriteLine(String.Format("{2}Temsil (Delegate) edilen fonksiyon '{0}' Sonrası : {1} " _
, temsilEdilenFonksiyonunIsmi _
, DiziIceriginiYaz(yeniDizi) _
, vbNewLine))
End Sub
''' {1, 2, 3} biçimden çıktılar üretir

Function DiziIceriginiYaz(ByVal dizi() As Integer) As String
Dim diziIcerigi As String = "{"

If (dizi.Length > 0) Then
Dim diziElemeani As String = dizi(0)
diziIcerigi = String.Concat(diziIcerigi, diziElemeani)

For i As Integer = 1 To dizi.Length - 1
diziElemeani = String.Concat(" , ", dizi(i))
diziIcerigi = String.Concat(diziIcerigi, diziElemeani)
Next

diziIcerigi = String.Concat(diziIcerigi, "}")
End If

Return diziIcerigi
End Function
Sub Main()
Dim a() As Integer = {1, 2, 3}
Console.WriteLine(String.Format("Başlangıç verileri : {0} ", DiziIceriginiYaz(a)))

FonsiyonuUygula(a, AddressOf BirEkle, "BirEkle")
FonsiyonuUygula(a, AddressOf BirCikar, "BirCikar")
FonsiyonuUygula(a, AddressOf KareAl, "KareAl")

Console.ReadKey()
End Sub

Delegate / Temsilci

Peki “lambda ifadelerinin” yukarıda gördüğünüz temsilci kullanımını ve tanımlanan onca fonksiyona göre ne gibi bir avantajı vardır ?

Lambda ifadeleri ile, herhangi bir ön temsilci tanımlamasına ihtiyaç duymadan, hatta bu temsilci ile aynı imzada fonksiyonlar da hazırlama zahmetine girmeden, aynı işlevi yerine getirebilirsiniz.

Örnek kullanımı ;
Sub Main()
Dim a() As Integer = {1, 2, 3}
FonsiyonuUygula(a, Function(x) x + 1, "BirEkle")
FonsiyonuUygula(a, Function(x) x - 1, "BirCikar")
FonsiyonuUygula(a, Function(x) x * x, "KareAl")
End Sub

Lambda

Sadece bu kadar… Yukarıdaki örnek uygulamayı http://mehmetozakan.com/Download/LamdaEx.rar adresinden indirebilirsiniz.