C# (C Sharp) Ders 5 – Metotlar

Belirli bir amaca göre tasarlanmış kod bloklarından oluşan metotlar, programlama dillerinin en önemli bileşenlerinden birisidir. Metotlar, özellikle fonksiyonel dillerde fonksiyonlar olarak bilinmektedir. Metotlar bir defa üretildiklerinde, gereken sayıda tekrar tekrar kullanılabilir. C# kodlarının okunurluğunu artırmak ve metodu farklı bölümlerde tekrar tekrar kullanmak için, metotlar mümkün olduğu kadar spesifik bir görevi yerine getirmek için tasarlanmalıdır.

Metotlar, parametre alarak genel amaca hizmet edebilirler.  Metotlar birden fazla parametre alacaksa parametreler virgül (,) ile birbirlerinden ayrılırlar. Metotlar bir sonuç döndürebilir veya herhangi bir sonuç döndürmeyen void türünde olabilirler. C# programlama dilinde metotlar, bir sınıf (class) veya bir yapı (struct) içerisinde yazılabilir. Bunun dışındaki alanlarda metot yazmak mümkün değildir. Her program, belirli bir başlangıç noktasından başlar. C# programlarında başlangıç noktası Main metodudur.

Örnek kullanım:

C#
using System;

namespace MetotOrnegi;

class Program
{
    public static void Karesi(int _sayi) // Main metodu içerisinde çağrılacak metot oluşturulur
    {
        Console.WriteLine(_sayi  + " sayısının karesi: " + _sayi * _sayi); // gerekli hesaplar yapılıp işlem sonucu konsola yazılır
     }

    static void Main(string[] args)
    {
        int sayi = 80; // karesi hesaplanacak sayı

        Karesi(sayi); // yapılan işlem sonucunu konsola yazacak metot çağrılır
    }
}

Yukarıdaki örnekte, Main metodunun dışında kare hesaplama yapan bir metot oluşturulmuştur. Ardından, ilgili metot Main metodunun içerisinde çağrılarak, işlem sonucunun konsola yazdırılması sağlanmıştır. Bir metot, Main metodu içerisinde çağrılmak isteniyorsa, çağrılan metodun da statik olması gereklidir. C# programlama dilinde, statik olan bir metottan başka bir metot çağrılacaksa ilgili metodun da statik olması gerekir.

Metotlara, zorunlu ve opsiyonel parametreler atanabilmektedir. Opsiyonel parametrelerin varsayılan değerleri olmalıdır. Eğer opsiyonel parametreler kullanılacaksa, ilk olarak zorunlu parametreler tanımlanmalıdır.

Örnek kulanım:

C#
using System;

namespace DortIslem;

class Program
{
    /*
    Dört işlem yapacak metot oluşturuldu.
    iki tane zorunlu, bir tane opsiyonel parametre çağrıldı.
    Opsiyonel parametreye bir değer atandı, metot çağrılırken bu parametre kullanılmazsa buradaki default değer kullanılır.
    */
    public static double DortIslem(double _ilkSayi, double _ikinciSayi, int _islemTuru = 1)
    {
        double sonuc = 0.0;

        switch (_islemTuru)
        {
            case 1:
                sonuc = _ilkSayi + _ikinciSayi; // Toplama
                break;
            case 2:
                sonuc = _ilkSayi - _ikinciSayi; // Çıkarma
                break;
            case 3:
                sonuc = _ilkSayi * _ikinciSayi; // Çarpma
                break;
            case 4:
                sonuc = _ilkSayi / _ikinciSayi; // Bölme
                break;
        }
        return sonuc; // metot, return anahtar kelimesi kullanılarak bir değer döndürür
    }

    static void Main(string[] args)

    {
        double ilkSayi = 7; // işlemlerde kullanılacak ilk değişken oluşturuldu
        double ikinciSayi = 14; // işlemlerde kullanılacak ikinci değişken oluşturuldu
        int islemTuru = 4; // yapılacak işlemin türünü belirten ve metoda parametre olarak gönderilmesi opsiyonel olan değişken oluşturuldu

        double islemSonuc = DortIslem(ilkSayi, ikinciSayi); // double tipinde bir değişken oluşturuldu ve döndürülen değer bu değişkene atandı
        Console.WriteLine("Toplama İşlemi Sonucu: " + islemSonuc); // sonuç konsola yazdırılır

        islemSonuc = DortIslem(ilkSayi, ikinciSayi, islemTuru); // yeni işlemin sonucu ilgili değişkene yeniden atandı
        Console.WriteLine("Bölme İşlemi Sonucu: " + islemSonuc); // sonuç konsola yazdırılır
    }
}

C# programlama dilinde değer ve referans türünde değişkenler bulunmaktadır. Metotlara, parametre olarak değer türünde bir değişken gönderildiğinde, değişkenin bir kopyası metoda gönderilir ve yapılan değişiklikler orijinal değişkende yapılmaz. Fakat, referans türünde bir değişken metoda gönderildiğinde değişkenin referansı gönderildiği için, metot içerisinde yapılan değişiklikler orijinal değişkende gerçekleşir. Eğer ref anahtar kelimesi kullanılırsa, değer türündeki değişkenin de orijinal değeri değişir.

Örnek kullanım:

C#
using System;

namespace DegerveReferans
{
    class Program
    {
        public static void Yazdir(string isim, ref int numara, int[]rakamDizisi)
            {
                isim = "Ahmet";
                numara = 30;
                rakamDizisi[0] = 5;
 
                Console.WriteLine(isim);
                Console.WriteLine(numara);
                Console.WriteLine(rakamDizisi);
            }

        static void Main(string[] args)
        {
            string kAdi = "Admin"; // Referans tipi olmasına rağmen Değer tipi olarak işlem gördüğü için metot içerisinde orijinal değeri değişmez, bir kopyası oluşturulur.
            int kNumarasi = 20; // Değer tipi değişken olduğu için metot içerisinde orijinal değeri değişmez, bir kopyası oluşturulur.
            int[] rakamlar = { 1, 2, 3, 4 }; // Referans tipi değişken olduğu için metot içerisinde orijinal değeri de değişir

            Yazdır(kAdi, ref kNumarasi, rakamlar);

            Console.WriteLine("isim: " + kAdi); // değişkenin orijinal değeri değişmemiştir
            Console.WriteLine("numara: " + kNumarasi); // ref anahtar kelimesi kullanıldığı için değişkenin orijinal değeri değişmiştir
            foreach (int rakam in rakamlar)
            {
                Console.WriteLine(rakam); // referans türündeki değişkenin orijinal değeri değişmiştir, ilk değer artık 1 değiş 5 olmuştur
            }           
        }       
    }
}

 Özyinelemeli Metotlar (recursive)

Kendi içerisinde kendisini tekrar çağıran metotlara özyinelemeli (recursive) metotlar denir. Daha karmaşık problemlerin daha az kod yazılarak çözülmeleri için kullanılırlar.

Örnek kullanım:

C#
using System;

namespace RecursiveMetot;

class Program
{
    public static int FaktoriyelHesaplama(int n)
    {
        if (n < 0)
        {
            Console.WriteLine("Negatif sayıların faktöriyeli tanımlanmamıştır. Lütfen pozitif bir sayı giriniz!");
            return 0;
        }
        else if (n == 0 || n == 1)
        {
            return n;
        }
        else
        {
            return n * FaktoriyelHesaplama(n - 1);
        }       
    }

    static void Main(string[] args)
    {
        int sayi = 4;

        Console.WriteLine($"{sayi} sayısının faktöriyeli: {FaktoriyelHesaplama(sayi)}");
    }
}

 Kaynak: https://learn.microsoft.com/tr-tr/dotnet/csharp/tour-of-csharp/tutorials/