Normal şartlarda sınıflar üzerinde operatör (- + / vs.) kullanılamaz fakat C# sınıfları operatörlere uygun hale getirmeye imkan veriyor. Sınıfın içine yazacağımız metotlar ile ilgili operatörün nesne için nasıl çalışacağını belirleyebiliyoruz. Bu işleme operatörlerin aşırı yüklenmesi (operator overloading) denir.

C# - Operator Overloading (Operatörlerin Aşırı Yüklenmesi)

Mesela iki boyutlu bir oyun geliştiriyor olalım ve nesnelerin ekrandaki konumunu tutmak için X ve Y değerlerini tutan aşağıdaki sınıfı yazmış olalım.

1.class Nokta
2.{
3.    public int X { get; set; }
4.    public int Y { get; set; }
5.}

Çarpışma kontrolü yapmak istedik ve test için aşağıdaki gibi bir şey yazdık.

1.Nokta a = new Nokta { X = 50, Y = 50 };
2.Nokta b = new Nokta { X = 50, Y = 50 };
3.
4.if (a == b)
5.{
6.    Console.Write("İki nokta aynı");
7.}
8.else
9.{
10.    Console.Write("İki nokta farklı.");
11.}

Belirlediğimiz her iki nesnede de noktalar (X ve Y değerleri) aynı. Yukarıdaki kontrolü yaptık ve sonucun "aynı" olmasını bekledik ama olmadı. Böyle olmalıydı çünkü şuanda C# bu nesneleri nasıl karşılaştıracağını bilmiyor. Şimdi sınıfın içine iki tane daha metot ekleyip == ve != operatörlerini aşırı yükleyerek içlerinde X ve Y değerlerini teker teker kontrol edip sonucu döndürelim.

1.public static bool operator ==(Nokta a, Nokta b)
2.{
3.    return (a.X == b.X) && (a.Y == b.Y);
4.}
5.
6.public static bool operator !=(Nokta a, Nokta b)
7.{
8.    return (a.X != b.X) || (a.Y != b.Y);
9.}

Operatör aşırı yükleme metotları static olmalıdır ve dönüş tipleri belirlenmelidir. Hangi operatörü aşırı yüklemek istediğimizi yazarız fakat bu metotların isimleri yoktur. İki parametre gelir; birisi nesne1 == nesne2 karşılaştırmasındaki soldaki, diğeri ise sağdaki.

Aynı oyunda iki objenin uzaklığını bulmamız gerektiğini düşünelim. İki sayının farkını almak için mutlak değeri bulunur. Biz de öyle yaparak bir noktanın X ve Y özelliklerinin diğer noktanın özellikleri ile karşılaştırıp mutlak değerini alacağız ve geriye bir Nokta nesnesi döndüreceğiz. Bu işlem için - (çıkarma) operatörünü aşırı yükleyeceğiz. Şimdi gerekli metodu yazıp sınıfa ekleyelim.

1.public static Nokta operator -(Nokta a, Nokta b)
2.{
3.    return new Nokta {
4.        X = Math.Abs(a.X - b.X),
5.        Y = Math.Abs(a.Y - b.Y)
6.    };
7.}

Bu arada bir sayının mutlak değerini almak için Math.Abs metodu kullanılır. Eşitlik (==) operatörünü aşırı yüklerken geride bool bir değer döndürmüştük. Ancak - (çıkarma) bir karşılaştırma operatörü olmadığı için nesnenin bir referansını döndürdük. Şimdi aşağıdaki gibi test edip çalışıp çalışmadığına bakalım.

1.Nokta oyuncu = new Nokta { X = 60, Y = 20 };
2.Nokta canavar = new Nokta { X = 50, Y = 50 };
3.
4.Nokta uzaklik = oyuncu - canavar;
5.
6.Console.WriteLine("Yatay uzaklık: " + uzaklik.X);
7.Console.WriteLine("Dikey uzaklık: " + uzaklik.Y);

Aşağıdaki çıktıyı almış olmalısınız.

Yatay uzaklık: 10 Dikey uzaklık: 30

Bu arada aşırı yüklenen metodun ikinci parametresi bir nesne olmak zorunda değil. İsterseniz int, string, float gibi built-in tipler ile de karşılaştırma yapabilirsiniz. Tabi ona göre metot yazmalısınız.