Metotlar

       Daha önceli konularda da dikkat ettiyseniz eğer tüm uygulamayı “Main” içerisinde yazıp tamamlıyorduk. Fakat büyük bir proje geliştirdiğimizde tüm akışı “Main” içerisine yazmamış pek doğru bir yaklaşım değildir. Çünkü uzun ve karmaşık metotlar(fonksiyonlar) her zaman hata çözümünü zorlaştırır ve kod okunabilirliği açışından tercih edilmezler.

 

Metot nedir?

       Program içerisinde bir işi, bir görevi yerine getirmek için yazılmış alt programlara metot denir.  Metotlar uygulama içerisinde çağırılana kadar herhangi bir işlem yapmazlar. Bir metodun çalışması için o metodu çağırmamız gerekmektedir.

       Bazı metotlar kendisine verilen görevi yerine getirebilmesi için çalışmadan önce bir takım değerler alması gerebilir. Metodun çağırılırken aldığı değerlere “parametre” yada “metot argümanları”denir.

       Metot yaptığı iş sonunda kendisini çağıran fonksiyona değer dönmesi gerekebilir. Bu değerlere de “geri dönüş değeri” denir.

Metot oluşturma

       Bir metodun yapısı aşağıdaki gibidir.

[erişim belirteci] [geri dönüş değeri] [metot ismi] ([aldığı parametreler])
{
     Metot içi işlemler
}

      [erişim belirteci]; program içerisinde metoda nerelerde erişilebileceğini tanımladığımız alandır. Bu alana public, private, protected yazabiliriz. Metodun başına herhangi bir erişim belirteci yazmadığınız durumlarda ise varsayılan değer olarak private özelliğini taşır ve sadece yazıldığı sınıf(class) içerisinde erişilebilir durumda olur.

       [geri dönüş değeri]; metot çalıştıktan sonra bir sonuç dönmesi gerekiyorsa dönecek türü burada belirmemiz gerekmektedir. Bu değer herhangi bir veri türü olabileceği gibi bizim oluşturduğumuz bir sınıf da olabilir. Eğer yazdığımız metot bir değer dönmeyecek ise “void” yazarak metodun bir değer dönüşü yapmayacağını belirtmemiz gerekir.

       Örneğin verdiğimiz iki tam sayıyı toplayıp bize sonucunu dönen metot tanımlaması aşağıdaki gibidir;

        static void Main(string[] args)
        {
            int toplam = Topla(3,4);
            Console.WriteLine("Toplam: " + toplam);
        }

        static int Topla(int sayi1, int sayi2)
        {
            return sayi1 + sayi2;
        }

        Verdiğimiz metini ekrana yazdıran başka bir metot yazalım

        static void Main(string[] args)
        {
            int toplam = Topla(3,4);
            ToplamiYazdir(toplam);
        }

        static void ToplamiYazdir(int toplam)
        {
            Console.WriteLine("Toplam: " + toplam);
        }
        static int Topla(int sayi1, int sayi2)
        {
            return sayi1 + sayi2;
        }

       Yukarıda örnekte Topla metodu verilen iki sayıyı toplayıp sonucunu geri dönmesi gerektiği için “int” tipinde geri dönüş değeri tanımlanmıştır. Fakat “ToplamiYazdir” metodu sadece verilen sayıyı ekrana yazdırması gerektiği için herhangi bir geri dönüş değeri de gerekmediğinden “void” olarak tanımlanmıştır.

Metotların aşırı yüklenmesi(method overloading)

        “Method Overloading”, Türkçeye aşırı yükleme olarak çevrildiğinde anlamsal olarak pek bir şey ifade etmeyebilir.

       Tanımladığımız bir metoda aynı isimde, farklı türde veya sayıda parametre alan başka bir fonksiyon yazdığımızda oluşturduğumuz isimdeki metodu aşırı yükleme(overload) yapmış oluruz.

       Bu konuyu şimdi yukarıdaki sayı topladığımız “Topla” metodumuz üzerinden açıklayalım.

       “Topla" metodumuz sadece iki tane “int” veri türünde sayı almaktadır. Biz bu topla fonksiyonuna 3 ve 4 tane daha “int” veri türünde sayı alabilen aşırı yükleme (overload) fonksiyon yazalım. Burada dikkat edilmesi gereken bir nokta da, overload işlemi yapılırken var olan  ve yeni yazdığımız metodlara herhangi bir yeni bir kod eklemiyoruz. Programımız çalışma zamanında en uygun fonksiyonu kendisi seçmektedir.

        static int Topla(int sayi1, int sayi2)
        {
            return sayi1 + sayi2;
        }
        static int Topla(int sayi1, int sayi2, int sayi3)
        {
            return sayi1 + sayi2 + sayi3;
        }
        static int Topla(int sayi1, int sayi2, int sayi3,int sayi4)
        {
            return sayi1 + sayi2 + sayi3 + sayi4;
        }

        Yukarıdaki fonksiyonları kullanabilmemiz için de aşağıdaki gibi çağırma işlemi yapabiliriz.

     int ikiSayininToplami = Topla(1, 2);
     int ucSayininToplami = Topla(3, 4, 5);
     int dortSayininToplami = Topla(6,7,8,9);

        Şimdiye kadar yazdığımız “Topla” metodları int tam sayı veri toplamaktadır. Peki biz iki tane virgüllü sayı toplamak istediğimizde ne yapmamız gerekmektedir?

      static int Topla(int sayi1, int sayi2)
        {
            return sayi1 + sayi2;
        }
        static double Topla(double sayi1, double sayi2)
        {
            return sayi1 + sayi2;
        }

        Programımız çalışma zamanında yine kendisine uygun metodu aşağıdaki gibi çağırdığımızda bulacaktır.

      int ikiTamSayininToplami = Topla(1, 2);
      double ikiVirgulluSayininToplami = Topla(0.7, 1.2);

Kendi kendini çağıran metotlar (Recursive Methods)

       Tanımladığımız bir metotda, tekrardan kendisini çağırabilir, bu şekilde içe doğru bir döngü yaratabiliriz. Recursive metotlarda en bilinen örnek faktöriyel hesabı yapmaktadır.

       static void Main(string[] args)
        {
            var sayininFaktoriyeli = FaktoriyelAl(4);
        }

        static int FaktoriyelAl(int n)
        {
            if (n == 0)
            {
                return 1;
            }
            else
            {
                return n * FaktoriyelAl(n - 1);
            }
        }

Metot ile ilgili bilinmesi gerekenler

  • Main() console uygulamalarında varsayılan olarak tanımlandığı için aynı isimde metot oluşturamayız.
  • Bir metot parametre almak zorunda değildir, parametre almadığı durumlarda parantez içi boş bırakılır.
  • Metodun geri dönüş değeri mutlaka belirtilmelidir.(void, string, int,…)
  • Varsayılan parametre değer belirtilmemiş metotlarda parametreleri eksiksiz girmemiz gerekmektedir. Örneğin yukarıdaki “Topla” metoduna Topla(3) diyerek çağırma işlemi yapamayız.
  • int türünde değer dönen bir metodun dönüş değerini string değişkene doğrudan alamayız. Tür dönüşüm kurallarına dikkat etmeliyiz. Buradan ilgili makaleye ulaşabilirsiniz.
  • Geri dönüş değeri olmayan metotlarda return ifadesi kullanılmaz.
  • C# 7.0 ile beraber fonksiyon içerisinde fonksiyon tanımlaması yapılabilmektedir fakat 7.0 altında kullanılan versiyonarlarda fonksiyon içerisinde fonksiyon tanımlaması yapılamamaktadır.
  • Metot içerisinde tanımlanan değişkenler metodun görevi bittikten sonra hafızadan silinir. Hafızada yer almasını istediğiniz değişkenlerin tanımlaması global yapılmalıdır.

 

 

 

 

Add comment