C# Metotlar

 

Metotlar, yalnızca çağrıldıkları zaman çalışan ve tekrar tekrar kullanılabilen özelleştirilmiş kod bloklarıdır. Bir kez yazılarak çok kez kullanıldıkları için gereksiz kod tekrarının önüne geçilmiş olur.

 

Parametresiz ve Geriye Değer Döndürmeyen Metotlar

Adından da anlaşıldığı gibi parametre almayan metotlardır. Aşağıdaki örnekte parametre almayan ve geriye değer döndürmeyen ShowMessage adında metot tanımlanmıştır. Metodun geriye değer döndürmeyeceği "void" anahtar kelimesiyle belirtilmiştir.


static void Main(string[] args)
{

    showMessage();

    Console.ReadLine();

}


// Parametresiz ve geriye değer döndürmeyen metot

static void showMessage()
{

    Console.WriteLine("Merhaba Dünya");

}

 

Parametresiz ve Geriye Değer Döndüren Metotlar

Aşağıdaki örnekte ise yine parametresiz ancak geriye string tipinde bir dizi döndüren GetMonths adında bir metot tanımlanmıştır


static void Main(string[] args)
{

    var months = GetMonths();

    foreach (string month in months)
    {
        Console.WriteLine(month);
    }

    Console.ReadLine();

}


// Parametresiz ve geriye string tipinde dizi (array) döndüren metot

static string[] GetMonths()
{

    string[] stringArray = new string[] { "Ocak", "Şubat", "Mart", "Nisan", "Mayıs" };

    return stringArray;

}

 

Parametreli ve Geriye Değer Döndürmeyen Metotlar

Aşağıdaki örnekte parametre alan ancak geriye değer döndürmeyen metot tanımlanmıştır.

class Program
{
    static void Main(string[] args)
    {

        int[] numbers = new int[] { 1, 3, 2, 4, 14, 8, 23, 70 };

        OddNumbers(numbers);

        Console.ReadLine();

    }

    // integer tipinde dizi parametresi alan ve geriye değer döndürmeyen tek sayılar metodu

    static void OddNumbers(int[] numberArray)
    {

        for (int i = 0; i < numberArray.Length; i++)
        {
            if (numberArray[i] % 2 != 0)
            {
                Console.WriteLine(numberArray[i]);
            }

        }

    }

}

 

Metotların Aşırı Yüklenmesi (Method Overloading)

Metot aşırı yükleme işleminde metotların isimleri aynıdır, ancak parametre sayıları ve/veya parametre tipleri farklı olmalıdır.

  • Parametre sayıları aynı ise parametre tiplerinden en az biri farklı olmalıdır.
  • Parametre tipleri aynı ise parametre sayıları farklı olmalıdır.
  • Aşırı yüklenmiş metotların geri dönüş tipi aynı ya da farklı olabilir. Geri dönüş tipi belirleyici faktör değildir.

 

static void Main(string[] args)
{

    Calculate(15, 20);

    Calculate(3, 4, 5);

    Calculate(3, 4, 5.68);

    double volume = Calculate(15.3, 20.34, 25.5);
    Console.WriteLine("Volume = " + volume);

    Console.ReadLine();

}

static void Calculate(int length, int width)
{
    int area = length * width;
    int perimeter = 2 * (length + width);

    Console.WriteLine("Length: " + length);
    Console.WriteLine("Width: " + width);
    Console.WriteLine("Area = " + area);
    Console.WriteLine("Perimeter = " + perimeter);

    Console.WriteLine();

}

static void Calculate(int length, int width, int height)
{
    Console.WriteLine("Length: " + length);
    Console.WriteLine("Width: " + width);
    Console.WriteLine("Height: " + height);

    int volume = length * width * height;

    Console.WriteLine("Volume = " + volume);

    Console.WriteLine();
}

static void Calculate(int length, int width, double height)
{
    Console.WriteLine("Length: " + length);
    Console.WriteLine("Width: " + width);
    Console.WriteLine("Height: " + height);

    double volume = length * width * height;
    Console.WriteLine("Volume = " + volume);

    Console.WriteLine();
}

// Parametre alan ve geriye double tipinde değer döndüren metot örneği
static double Calculate(double length, double width, double height)
{
    double result = length * width * height;

    Console.WriteLine("Length: " + length);
    Console.WriteLine("Width: " + width);
    Console.WriteLine("Height: " + height);

    Console.WriteLine();

    return result;
}

 

params Anahtar Kelimesi

params keyword'ü eğer kullanıcının kaç parametre gireceği belli değilse kullanılır. Örneğin ortalama hesaplayan bir metot tanımlamak istersek girdiğimiz sayı adedine göre ortalama hesaplarız. Aşağıdaki kodda örnek kullanımı gösterilmiştir.

static void Main(string[] args)
{

    double average = CalculateAverage(12, 0, 37, 2);
    Console.WriteLine("Average1: " + average);


    // veya dizi(array) şeklinde
    double[] numbers = new double[]
    {
            15, 0, 14.8, 23,7, -6.14, 11
    };

    average = CalculateAverage(numbers);
    Console.WriteLine("Average2: " + average);

    Console.ReadLine();

}

static double CalculateAverage(params double[] numbers)
{
    double sum = 0;
    double average;

    for (int i = 0; i < numbers.Length; i++)
    {
        sum += numbers[i];
    }

    average = sum / numbers.Length;

    return average;
}

 

Recursive (Özyinelemeli) Fonksiyonlar

Kendini doğrudan veya dolaylı olarak çağıran fonksiyonlara recursive (özyinelemeli) fonksiyon denir. Örneğin sayının faktöriyelini hesaplamak veya fibonacci için yazılabilir.

Recursive fonksiyonlar gerçek hayatta örnek olarak parent child ilişkisi bulunan kategorilendirme sisteminde kullanılabilir. Ürün kategorisi, bu kategoriye ait alt kategoriler ve alt kategolerin de alt kategori dalları gibi...

Aşağıdaki kod faktöriyel hesaplayan recursive fonksiyon örneğidir.

static void Main(string[] args)
{

    // 7 x 6 x 5 x 4 x 3 x 2 x 1 = 5040
    long result = Factorial(7);

    Console.WriteLine("7! = " + result);

    Console.ReadLine();

}

static long Factorial(int number)
{

    if (number == 0)
    {
        return 1;
    }

    return number * Factorial(number - 1);

}