C# 2.0 İle Gelen Yenilikler -2
Anonim (Anonymous) Metotlar
Bilindiği gibi .NET ortamında, bazı özel metotların örneğin event handler ve diğer callback'lerin çağrımı doğrudan değil, delegate'ler kullanılarak dolaylı olarak gerçekleştirilen bir işlemdir. Delegate ile çağrım, sadece event handler metotlarında değil, getirilerinden dolayı normal fonksiyonlarda da kullanılan bir metottur. Bu metodolojinin uygulanması, programcının öncelikle çağırmak istediği fonksiyonun imzası ile uyumlu bir delegate bildirimi yapmasını, daha sonra bu delegate türünde bir nesne yaratarak, bu nesne üzerinden söz konusu fonksiyonu çağırmasını gerektirir. Ancak bu durum -en iyimser yorumla- programcının çok fazla kod yazmasına neden olmaktadır.
C# 2.0 ile gelen yeni özelliklerden birisi olan anonim metotlar ise, delegate'lere ilişkin yukarıda anlatılan olumsuzluğu gidermek adına tasarlanmışlardır. Anonim metotlar sayesinde, çağrılmak istenen fonksiyonun tanımlanması ile delegate sınıfı türündeki nesnenin yaratılması tek hamlede yapılabilen bir işlem haline gelmiştir. Böylece yazılan kod'ların kullanılabilirliği artar ve bakım işlemleri kolaylaşır.
İpucu : Anonim metotların bu noktada sağladığı kolaylığı, net bir biçimde ortaya koyabilmek adına, örnek 1'de delegate'lerin anonim olmayan metotla kullanımı, örnek 3'te ise aynı uygulamanın anonim metotla yazılmış hali gösterilmiştir.
Örnek 1 :
Aşağıdaki kod parçacığında -CompareValues fonksiyonunun dolaylı çağrımı için- Compare isimli bir delegate bildirimi yapılmış ve bu delegate (sınıfı) türünde cmp isimli bir nesne yaratılarak, CompareValues fonksiyonunun çağrımı örneklenmiştir.namespace AnonimMetotlar_1
{
// Delegate bildirimi
public
delegate bool Compare(int Val1, int Val2);
class Program
{
// Delegate ile çağrılmak
istenen fonksiyonun tanımlanması
public static bool
CompareValues(int V1, int V2)
{
if (V1
> V2)
return true;
else
return false;
}
static
void Main(string[] args)
{
//
Compare delegate sınıfı türünde nesne yaratılması
Compare
cmp = new Compare(CompareValues);
if (cmp(3, 5))
Console.WriteLine("İlk sayi büyük");
else
Console.WriteLine("İkinci sayi büyük");
Console.ReadLine();
}
}
}
Anonim Metot Tanımlanmasının Genel Biçimi
delegate ([parametre_listesi])
{
// Anonim metot gövdesi
};
Örnek 2 : Aşağıda örnek bir anonim metot kullanımı görülmektedir.
namespace AnonimMetotlar_2
{
// delegate bildirimi
delegate void Sample();
class Program
{
static void
Main(string[] args)
{
// Anonim metot tanımlaması
Sample smp = delegate()
{
Console.WriteLine("Anonim metot örneği");
};
//
Çağırma ifadesi
smp();
}
}
}
Anonim metotların parametrelerinde -normal metotlarda olduğu gibi- ref ve out anahtar sözcükleri kullanılabilir.
Anonim bir metodun gövdesi içinde goto deyimi kullanılarak, akışı metot gövdesi dışına çıkartmak C# 2.0 spesifikasyonunda yasaklanmıştır. Aynı şekilde anonim bir metodun gövdesi dışındaki bir goto deyimi ile akışı metot gövdesi içine atlatmak da yasaktır. Her iki durumda da bir derleme hatası alınır.
Örnek 3 : Aşağıdaki konsol uygulaması, örnek 1'in anonim metot kullanılarak yazılmış bir versiyonudur.
namespace AnonimMetotlar_3
{
// Delegate bildirimi
public
delegate bool Compare(int Val1, int Val2);
class Program
{
static void Main(string[] args)
{
// Anonim metot tanımlaması
Compare cmp = delegate (int V1, int V2)
{
if (V1 > V2)
return true;
else
return false;
};
if
(cmp(7, 5))
Console.WriteLine("İlk sayi büyük");
else
Console.WriteLine("İkinci sayi büyük");
Console.ReadLine();
}
}
}
Aykut TAŞDELEN
MVP (MS Most Valuable Professional)
Kaynak : .NET Framework 2.0 SDK