Makale Özeti

Bu makalede anonim metotlar konusu anlatılmakta ve örneklenmektedir. Aykut TAŞDELEN

Makale

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 : 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 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");

                Console.ReadLine(); 
         } 
    }
}


Aykut TAŞDELEN

MVP (MS Most Valuable Professional)

Kaynak : .NET Framework 2.0 SDK