Metod ve Operatör Aşırı Yükleme

C#’ta Metod Aşırı Yükleme (Method Overloading) ve Operatör Aşırı Yükleme (Operator Overloading), bir metodu veya operatörü farklı parametrelerle veya özel işlevlerle yeniden tanımlamamızı sağlar. Bu teknikler kod tekrarını önlemek, esneklik sağlamak ve okunabilirliği artırmak için kullanılır.

1. Metod Aşırı Yükleme (Method Overloading)

1.1. Method Overloading Nedir?

  • Aynı isimli bir metodu farklı parametre listeleriyle tanımlama işlemidir.
  • Dönüş tipi farklı olabilir, ancak sadece dönüş tipine göre overload yapılamaz.
  • Parametre sayısı veya tipi farklı olmalıdır.

1.2. Metod Aşırı Yükleme Örneği

using System;

class Program
{
    // 1. Metot: İki tam sayı toplar
    static int Topla(int a, int b)
    {
        return a + b;
    }

    // 2. Metot: Üç tam sayı toplar
    static int Topla(int a, int b, int c)
    {
        return a + b + c;
    }

    // 3. Metot: Ondalıklı iki sayıyı toplar
    static double Topla(double a, double b)
    {
        return a + b;
    }

    static void Main()
    {
        Console.WriteLine(Topla(5, 10)); // 15
        Console.WriteLine(Topla(5, 10, 20)); // 35
        Console.WriteLine(Topla(5.5, 2.3)); // 7.8
    }
}
C#
C#
15
35
7.8
C#

Not: Metotlar, parametre sayısı veya türüne göre otomatik seçilir.

1.3. Method Overloading ile Default Parametre Kullanımı

Varsayılan parametre değerleri ile metodun farklı varyasyonlarını tek bir tanımda yazabiliriz.

void MesajGoster(string mesaj = "Varsayılan Mesaj")
{
    Console.WriteLine(mesaj);
}

MesajGoster(); // Varsayılan Mesaj
MesajGoster("Özel Mesaj"); // Özel Mesaj
C#

1.4. Overloading ile Ref ve Out Kullanımı

Ref ve Out parametreleri ile de metot aşırı yükleme yapılabilir.

void DegerArttir(ref int sayi)
{
    sayi += 10;
}

void DegerArttir(out int sayi)
{
    sayi = 10;
}

int x = 5;
DegerArttir(ref x);
Console.WriteLine(x); // 15

int y;
DegerArttir(out y);
Console.WriteLine(y); // 10
C#

1.5. Method Overloading Kullanım Alanları

  • Matematik işlemleri (Topla(int, int), Topla(double, double))
  • Veritabanı işlemleri (Farklı parametrelerle veri sorgulama)
  • Dosya işlemleri (Dosya açma, okuma, yazma işlemleri)
  • UI bileşenleri (Aynı metot, farklı parametrelerle çağrılabilir)

2. Operatör Aşırı Yükleme (Operator Overloading)

2.1. Operator Overloading Nedir?

C#’ta bazı operatörler (+, -, *, /, ==, !=, <, >) özel sınıflar için yeniden tanımlanabilir.
Bu işlem operatör aşırı yükleme (operator overloading) olarak adlandırılır.

Temel Kurallar:

  • public static olarak tanımlanmalıdır.
  • Parametre olarak en az bir kullanıcı tanımlı tür (class veya struct) almalıdır.
  • Bazı operatörler (&&, ||, =) aşırı yüklenemez.

2.2. Operatör Aşırı Yükleme Örneği

Aşağıdaki örnekte, iki Nokta nesnesini toplamak için + operatörünü aşırı yüklüyoruz.

using System;

class Nokta
{
    public int X { get; set; }
    public int Y { get; set; }

    public Nokta(int x, int y)
    {
        X = x;
        Y = y;
    }

    // + Operatörünü aşırı yükleme
    public static Nokta operator +(Nokta n1, Nokta n2)
    {
        return new Nokta(n1.X + n2.X, n1.Y + n2.Y);
    }

    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

class Program
{
    static void Main()
    {
        Nokta nokta1 = new Nokta(3, 4);
        Nokta nokta2 = new Nokta(1, 2);

        Nokta toplam = nokta1 + nokta2;
        Console.WriteLine(toplam); // (4, 6)
    }
}
C#

2.3. Karşılaştırma Operatörlerini Aşırı Yükleme

Eşitlik (==) ve eşitsizlik (!=) operatörlerini aşırı yükleyerek iki nesnenin eşit olup olmadığını kontrol edebiliriz.

class Nokta
{
    public int X { get; set; }
    public int Y { get; set; }

    public Nokta(int x, int y)
    {
        X = x;
        Y = y;
    }

    public static bool operator ==(Nokta n1, Nokta n2)
    {
        return n1.X == n2.X && n1.Y == n2.Y;
    }

    public static bool operator !=(Nokta n1, Nokta n2)
    {
        return !(n1 == n2);
    }

    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

class Program
{
    static void Main()
    {
        Nokta nokta1 = new Nokta(5, 10);
        Nokta nokta2 = new Nokta(5, 10);
        Nokta nokta3 = new Nokta(2, 3);

        Console.WriteLine(nokta1 == nokta2); // True
        Console.WriteLine(nokta1 != nokta3); // True
    }
}
C#

Not: == ve != operatörlerini aşırı yüklediğimizde, Equals() ve GetHashCode() metodlarını da geçersiz kılmalıyız.

2.4. Karşılaştırma (>, <) Operatörlerini Aşırı Yükleme

class Nokta
{
    public int X { get; set; }
    public int Y { get; set; }

    public Nokta(int x, int y)
    {
        X = x;
        Y = y;
    }

    public static bool operator >(Nokta n1, Nokta n2)
    {
        return n1.X > n2.X && n1.Y > n2.Y;
    }

    public static bool operator <(Nokta n1, Nokta n2)
    {
        return n1.X < n2.X && n1.Y < n2.Y;
    }
}

class Program
{
    static void Main()
    {
        Nokta nokta1 = new Nokta(5, 10);
        Nokta nokta2 = new Nokta(3, 8);

        Console.WriteLine(nokta1 > nokta2); // True
        Console.WriteLine(nokta1 < nokta2); // False
    }
}
C#

3. Method Overloading ve Operator Overloading Karşılaştırması

ÖzellikMethod OverloadingOperator Overloading
AmaçAynı isimli metodun farklı parametrelerle kullanılmasını sağlar.Operatörlerin özel anlamlarla kullanılmasını sağlar.
UygulamaTopla(int, int), Topla(double, double) gibi+, -, ==, != gibi operatörler için
SınırlamalarSınırsız sayıda aşırı yüklenebilir.Belirli operatörler aşırı yüklenebilir.