C# sınıf içinde aynı isimle metot tanımlamaya izin verir. Ancak tanımlanan metotların aldığı parametreler farklı olmalıdır. Tek bir sınıf içinde aynı isimli metotların farklı parametrelerle farklı yorumlamasına metotların aşırı yüklenmesi (method overloading) denir.

Mesela Console.WriteLine metodunu düşünün. Hiç dönüştürme işlemi yapmadan her türlü tipteki (int, string vs.) veriyi parametre olarak verebiliriz. Ancak hiç sesini çıkarmaz bu tam on dokuz tane aşırı yükleme yapılmış cefakar metot.

Şimdi biz de bir örnek yapalım ve verilen sayıları toplayıp geri döndüren basit bir sınıf yazalım.

class Matematik
{
    public int Topla(int a, int b)
    {
        return a + b;
    }

    public int Topla(int a, int b, int c)
    {
        return a + b + c;
    }

    public int Topla(int a, int b, bool haberVer)
    {
        if (haberVer)
        {
            Console.WriteLine("Haberin olsun topluyorum!");
        }

        return a + b;
    }
}

Sınıfı kullanırken Topla metodunu yazmak üzereyken Visual Studio metodun imzasını ve kaç tane aşırı yüklenmiş hali olduğunu söyleyecektir.

Method Overloading
(+2 overloads)

Metodun adı ve aldığı parametrelerin isimleri ve sayısı imzasıdır. Metot aşırı yüklemede parametre(ler) değiştiği için metodun imzası (method signature) da değişmiş oluyor.

Matematik matematik = new Matematik();

int sonuc = 0;

sonuc = matematik.Topla(12, 7);
Console.WriteLine("12 + 7 = " + sonuc);

sonuc = matematik.Topla(7, 14, 21);
Console.WriteLine("7 + 14 + 21 = " + sonuc);

sonuc = matematik.Topla(5, 3, true);
Console.WriteLine("5 + 3 = " + sonuc);

Sınıfı yukarıdaki gibi test ederseniz alacağınız çıktı aşağıdaki gibi olacaktır.

12 + 7 = 19 7 + 14 + 21 = 42 Haberin olsun topluyorum! 5 + 3 = 8

Başka bir örnekte sınıfın yapıcı metodunu (constructor) aşırı yükleyelim.

class Uye
{
    public string Ad { get; set;}

    public Uye()
    {
        // Buralar hep dutluk...
    }

    public Uye(string ad)
    {
        this.Ad = ad;
    }

    public override string ToString()
    {
        return this.Ad;
    }
}

Böylece sınıftan referans alırken ismi belirtme zorunluluğunu kaldırmış olduk. Ya da ekstra bir satırla isim yazmaktan kurtulduk. Ayrıca sınıfın ToString metodunu (tüm sınıflar Object sınıfından kalıtılmıştır) WriteLine metodu ile yazdırınca Ad özelliğini döndürmek üzere override ettik. Aşağıdaki gibi de test edebiliriz.

Uye uye1 = new Uye();
uye1.Ad = "Umut";

Uye uye2 = new Uye("Çağdaş");

Console.WriteLine(uye1);
Console.WriteLine(uye2);

NOT: Örneklerde kullanmamışım ama metot imzası farklı olduğu sürece aşırı yüklenmiş metotlarda farklı dönüş tipleri kullanabilirsiniz.