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 callbacklerin çağrımı doğrudan değil, delegateler 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, delegatelere 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 kodları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 1de delegatelerin anonim olmayan metotla kullanımı, örnek 3te ise aynı uygulamanın anonim metotla yazılmış hali gösterilmiştir.
Örnek 1 :
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 1in 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");
Aykut TAŞDELEN
MVP (MS Most Valuable Professional)
Kaynak : .NET Framework 2.0 SDK