İndeksleyiciler (this[])
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 37 / 70.
İndeksleyiciler, sınıfınızdaki öğelere dizi benzeri köşeli ayraç notasyonu kullanarak erişmenizi sağlar. collection.GetItem(0) gibi bir metodu çağırmak yerine, daha sezgisel olan collection[0] yazabilirsiniz.
Bir dizinleyiciyi, köşeli parantezlerle birlikte this anahtar kelimesini kullanarak tanımlarsınız:
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Artık kelimelere doğal bir şekilde erişebilirsiniz:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Merhaba
s[1] = "C#";
Console.WriteLine(s[1]); // C#Dizinleyiciler yalnızca tam sayılarla sınırlı değildir. İndeks parametresi olarak herhangi bir türü kullanabilirsiniz, bu da onları sözlük benzeri erişim için kullanışlı hale getirir:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Özellikler gibi, dizinleyiciler de salt okunur olabilir (setter'ı hariç tutarak) veya erişimcilerinde doğrulama mantığı barındırabilir. Sınıfınız bir koleksiyonu sarmaladığında veya köşeli ayraç notasyonu kodu daha okunabilir hale getirdiğinde idealdirler.
Görev
KolayTıpkı bir diziyle çalışıyormuş gibi, şarkılara sezgisel köşeli parantez notasyonu kullanarak erişmenizi sağlayan bir Playlist sınıfı oluşturalım. Bir indeksleyici (indexer) kullanarak şarkıların konumlarına göre alınabildiği ve güncellenebildiği bir müzik çalma listesi oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Playlist.cs:Musicad alanı (namespace) içinde, dahili bir şarkı koleksiyonunu sarmalayan ve bir indeksleyici aracılığıyla dizi benzeri erişim sağlayan birPlaylistsınıfı oluşturun. Çalma listeniz şunlara sahip olmalıdır:- Şarkı adlarını saklamak için özel (private) bir string dizisi
- Virgülle ayrılmış şarkı adlarından oluşan bir string kabul eden ve bunu dahili diziye bölen bir yapıcı metot (constructor)
- Belirli bir konumdaki şarkıları hem almayı hem de ayarlamayı sağlayan
this[int index]kullanan bir indeksleyici - Çalma listesindeki şarkı sayısını döndüren salt okunur bir
Countözelliği - Tüm şarkıları
" | "ile birleştirilmiş olarak döndüren birGetAllSongs()metodu
Program.cs: Ana dosyanızda, girdiden bir çalma listesi oluşturun, ardından şarkılara erişmek ve onları değiştirmek için indeksleyiciyi kullanın. Hem şarkıları indekse göre okumayı hem de belirli bir konumdaki şarkıyı güncellemeyi gösterin.
Üç girdi alacaksınız:
- Virgülle ayrılmış şarkı adları listesi (örneğin,
Song A,Song B,Song C) - Alınacak bir indeks (tam sayı)
- Aynı indeksteki şarkının yerine geçecek yeni bir şarkı adı
Çıktıyı şu formatta yazdırın:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}Örneğin, girdiler Rock Anthem,Jazz Vibes,Pop Hit, 1 ve Blues Classic ise çıktı şöyle olmalıdır:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hitİndeksleyicinin "Jazz Vibes" değerini almak için playlist[1] şeklinde erişmenize ve ardından onu güncellemek için playlist[1] = "Blues Classic" atamasını yapmanıza nasıl olanak tanıdığına dikkat edin - bu, GetSongAt(1) veya SetSongAt(1, "Blues Classic") gibi metotları çağırmaktan çok daha doğaldır!
Kopya kağıdı
Dizinleyiciler (Indexers), sınıfınızdaki öğelere metot çağrıları yerine dizi benzeri köşeli parantez notasyonu (collection[0]) kullanarak erişmenize olanak tanır.
Bir dizinleyiciyi, köşeli parantezlerle birlikte this anahtar kelimesini kullanarak tanımlayın:
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Kullanım örneği:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Dizinleyiciler, dizin parametresi olarak sadece tam sayıları değil, herhangi bir türü kullanabilirler:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Özellikler (properties) gibi, dizinleyiciler de salt okunur olabilir (setter'ı atlayarak) veya erişimcilerinde doğrulama mantığı içerebilirler.
Kendin dene
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: songList üzerinden bir Playlist nesnesi oluşturun
// TODO: Count özelliğini kullanarak toplam şarkı sayısını yazdırın
// TODO: İndeksleyiciyi kullanarak verilen indeksteki şarkıyı yazdırın
// TODO: İndeksleyiciyi kullanarak verilen indeksteki şarkıyı güncelleyin
// TODO: Güncellemeden sonra GetAllSongs() kullanarak tüm şarkıları yazdırın
}
}
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ı