Menu
Coddy logo textTech

Genişletme Metotları

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 39 / 70.

Genişletme metotları (Extension methods), mevcut türlere kaynak kodlarını değiştirmeden veya türetilmiş sınıflar oluşturmadan yeni metotlar eklemenize olanak tanır. Bu metotlar, ilgili türün yerel metotlarıymış gibi görünerek kodunuzu daha okunabilir ve sezgisel hale getirir.

Bir genişletme yöntemi (extension method) oluşturmak için, ilk parametresinden önce this anahtar kelimesi gelen statik bir sınıfta statik bir yöntem tanımlayın:

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(' ').Length;
    }
}

Artık bu metodu herhangi bir string üzerinde doğrudan çağırabilirsiniz:

string sentence = "Hello World Today";
int count = sentence.WordCount();  // 3

this string str parametresi, derleyiciye bu metodun string türünü genişlettiğini söyler. sentence.WordCount() metodunu çağırdığınızda, derleyici bunu arka planda StringExtensions.WordCount(sentence) ifadesine dönüştürür.

Genişletme metotları ek parametreler de alabilir:

public static bool IsLongerThan(this string str, int length)
{
    return str.Length > length;
}

// Kullanım
bool result = "Hello".IsLongerThan(3);  // true

Bu teknik, Where() ve Select() gibi metotların IEnumerable üzerinde genişletme metotları (extension methods) olduğu LINQ'te yaygın olarak kullanılır. Genişletme metotları, kontrolünüzde olmayan türlere yardımcı fonksiyonlar eklemek, kodunuzu temiz ve anlaşılır tutmak için güçlüdür.

challenge icon

Görev

Kolay

Tam sayılar için, yerleşik olarak bulunmasını bekleyeceğiniz kullanışlı işlevler ekleyen bir dizi genişletme (extension) yöntemi oluşturalım. Herhangi bir tam sayı üzerinde doğrudan çağrılabilen genişletme yöntemleri içeren statik bir sınıf oluşturacaksınız, bu da kodunuzu daha ifade edici ve okunabilir hale getirecektir.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • IntExtensions.cs: Utilities ad alanı (namespace) içinde IntExtensions adında statik bir sınıf oluşturun. Bu sınıf, int türünü geliştiren genişletme yöntemlerini içerecektir:
    • IsEven() - sayı çiftse true, aksi takdirde false döndürür
    • Square() - sayının kendisiyle çarpımını döndürür
    • IsInRange(int min, int max) - sayı min ve max (dahil) arasındaysa true, aksi takdirde false döndürür
    Genişletme yöntemlerinin statik bir sınıf içindeki statik yöntemler olması gerektiğini ve ilk parametrenin hangi türü genişlettiğinizi belirtmek için this anahtar kelimesini kullanması gerektiğini unutmayın.
  • Program.cs: Ana dosyanızda, girdiden bir tam sayı okuyun ve her üç genişletme yöntemini de gösterin. Her yöntemi, sanki yerleşik bir yöntemmiş gibi doğrudan tam sayı üzerinde çağırın ve ardından sonuçları yazdırın.

Üç girdi alacaksınız:

  • Test edilecek bir sayı (tam sayı)
  • Aralık kontrolü için minimum değer (tam sayı)
  • Aralık kontrolü için maksimum değer (tam sayı)

Çıktıyı şu formatta yazdırın:

Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}

Örneğin, girdiler 7, 5 ve 10 ise çıktı şu şekilde olmalıdır:

Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? True

number.IsEven() ve number.Square() yazmanın ne kadar doğal olduğuna dikkat edin - genişletme yöntemleri sanki her zaman tam sayı türünün bir parçasıymış gibi hissettiriyor!

Kopya kağıdı

Genişletme metotları (Extension methods), mevcut türlere kaynak kodlarını değiştirmeden yeni metotlar eklemenize olanak tanır. Bunlar, ilk parametresinden önce this anahtar kelimesi gelecek şekilde, statik bir sınıf içinde statik metotlar olarak tanımlanmalıdır.

Temel genişletme metodu sözdizimi:

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(' ').Length;
    }
}

Kullanım:

string sentence = "Hello World Today";
int count = sentence.WordCount();  // 3

İlk parametreden önceki this anahtar kelimesi, hangi türün genişletildiğini belirtir. Derleyici, sentence.WordCount() ifadesini StringExtensions.WordCount(sentence) olarak çevirir.

Ek parametreli genişletme metotları:

public static bool IsLongerThan(this string str, int length)
{
    return str.Length > length;
}

bool result = "Hello".IsLongerThan(3);  // true

Kendin dene

using System;
using Utilities;

class Program
{
    public static void Main(string[] args)
    {
        // Girdileri oku
        int number = Convert.ToInt32(Console.ReadLine());
        int min = Convert.ToInt32(Console.ReadLine());
        int max = Convert.ToInt32(Console.ReadLine());

        // TODO: 'number' üzerindeki genişletme metotlarını (extension methods) kullanın ve sonuçları yazdırın
        // number.IsEven(), number.Square() ve number.IsInRange(min, max) metotlarını çağırın
        // Şu formatta yazdırın:
        // {number} çift mi? {True/False}
        // {number} sayısının karesi: {result}
        // {number} sayısı [{min}-{max}] aralığında mı? {True/False}

    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler