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(); // 3this 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); // trueBu 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.
Görev
KolayTam 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:Utilitiesad alanı (namespace) içindeIntExtensionsadında statik bir sınıf oluşturun. Bu sınıf,inttürünü geliştiren genişletme yöntemlerini içerecektir:IsEven()- sayı çiftsetrue, aksi takdirdefalsedöndürürSquare()- sayının kendisiyle çarpımını döndürürIsInRange(int min, int max)- sayı min ve max (dahil) arasındaysatrue, aksi takdirdefalsedöndürür
thisanahtar 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]? Truenumber.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); // trueKendin 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}
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları