المفهرسات (Indexers (this[]))
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 37 من 70.
تسمح لك المفهرسات (Indexers) بالوصول إلى العناصر في فئتك (class) باستخدام تدوين الأقواس المربعة الشبيه بالمصفوفات. بدلاً من استدعاء طريقة (method) مثل collection.GetItem(0)، يمكنك كتابة collection[0] الأكثر بديهية.
تُعرّف المفهرس باستخدام الكلمة الأساسية this مع الأقواس المربعة:
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; }
}
}الآن يمكنك الوصول إلى الكلمات بشكل طبيعي:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // مرحباً
s[1] = "C#";
Console.WriteLine(s[1]); // C#المفهرسات ليست مقتصرة على الأعداد الصحيحة. يمكنك استخدام أي نوع كمعامل للفهرس، مما يجعلها مفيدة للوصول الشبيه بالقواميس:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}مثل الخصائص، يمكن أن تكون المفهرسات (indexers) للقراءة فقط (عن طريق حذف الـ setter) أو تتضمن منطق التحقق من الصحة في أدوات الوصول (accessors) الخاصة بها. إنها مثالية عندما يغلف الـ class الخاص بك مجموعة أو عندما يجعل تدوين الأقواس (bracket notation) الكود أكثر سهولة في القراءة.
التحدي
سهللنقم ببناء فئة Playlist تتيح لك الوصول إلى الأغاني باستخدام تدوين الأقواس البديهي، تماماً مثل التعامل مع مصفوفة. ستقوم بإنشاء قائمة تشغيل موسيقى حيث يمكن استرداد الأغاني وتحديثها حسب موقعها باستخدام مفهرس (indexer).
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Playlist.cs: قم بإنشاء فئةPlaylistداخل مساحة الأسماءMusicوالتي تغلف مجموعة داخلية من الأغاني وتوفر وصولاً يشبه المصفوفة من خلال مفهرس. يجب أن تحتوي قائمة التشغيل الخاصة بك على:- مصفوفة سلاسل نصية (string array) خاصة لتخزين عناوين الأغاني
- مشد (constructor) يقبل سلسلة نصية مفصولة بفاصلة لعناوين الأغاني ويقوم بتقسيمها إلى المصفوفة الداخلية
- مفهرس باستخدام
this[int index]يسمح بكل من جلب (get) وتعيين (set) الأغاني في موقع محدد - خاصية للقراءة فقط
Countتعيد عدد الأغاني في قائمة التشغيل - طريقة
GetAllSongs()تعيد جميع الأغاني مدمجة بواسطة" | "
Program.cs: في ملفك الرئيسي، قم بإنشاء قائمة تشغيل من المدخلات، ثم استخدم المفهرس للوصول إلى الأغاني وتعديلها. قم بتوضيح كل من قراءة الأغاني حسب الفهرس وتحديث أغنية في موقع محدد.
ستتلقى ثلاثة مدخلات:
- قائمة عناوين أغاني مفصولة بفاصلة (على سبيل المثال،
Song A,Song B,Song C) - فهرس لاسترداده (عدد صحيح)
- عنوان أغنية جديد لاستبدال الأغنية الموجودة في نفس ذلك الفهرس
اطبع المخرجات بهذا التنسيق:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}على سبيل المثال، إذا كانت المدخلات هي Rock Anthem,Jazz Vibes,Pop Hit، و 1، و Blues Classic، فيجب أن تكون المخرجات:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hitلاحظ كيف يتيح لك المفهرس الوصول إلى playlist[1] للحصول على "Jazz Vibes" ثم تعيين playlist[1] = "Blues Classic" لتحديثها - وهذا أكثر طبيعية بكثير من استدعاء طرق مثل GetSongAt(1) أو SetSongAt(1, "Blues Classic")!
ورقة مرجعية
تسمح لك المفهرسات (Indexers) بالوصول إلى العناصر في فئتك (class) باستخدام تدوين الأقواس الشبيه بالمصفوفات (collection[0]) بدلاً من استدعاءات الدوال.
قم بتعريف مفهرس باستخدام الكلمة المفتاحية this مع الأقواس المربعة:
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; }
}
}مثال على الاستخدام:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#يمكن للمفهرسات استخدام أي نوع كمعامل للفهرس، وليس فقط الأعداد الصحيحة:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}مثل الخصائص (properties)، يمكن أن تكون المفهرسات للقراءة فقط (عن طريق حذف الـ setter) أو تتضمن منطق تحقق في أدوات الوصول الخاصة بها (accessors).
جرّب بنفسك
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// قراءة المدخلات
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: إنشاء كائن `Playlist` من `songList`
// TODO: طباعة العدد الإجمالي للأغاني باستخدام الخاصية `Count`
// TODO: طباعة الأغنية عند الفهرس المعطى باستخدام الـ indexer
// TODO: تحديث الأغنية عند الفهرس المعطى باستخدام الـ indexer
// TODO: طباعة جميع الأغاني بعد التحديث باستخدام `GetAllSongs()`
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection