0Pricing
C# Academy · درس

المفهرسات

وصِلوا إلى الكائنات باستخدام صيغة شبيهة بالمصفوفات

المفهرسات درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما المفهرس؟

يتيح المفهرس الوصول إلى الكائن باستخدام الصياغة [ ]، مثل المصفوفة. وتعرّفه باستخدام this[...]. وهو مناسب جدًا للفئات التي تتصرف مثل المجموعات.

using System;

class Week
{
    private string[] _days = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };

    public string this[int index] => _days[index];
}

class Program
{
    static void Main()
    {
        var w = new Week();
        Console.WriteLine(w[0]);
        Console.WriteLine(w[6]);
    }
}

صياغة المفهرس

يشبه المفهرس الخاصية، لكنه يستخدم this ويأخذ قائمة معلمات بين قوسين مربعين. ويحتوي على get، وset اختياريًا.

using System;

class Scores
{
    private int[] _data = new int[5];

    public int this[int i]
    {
        get { return _data[i]; }
        set { _data[i] = value; }
    }
}

class Program
{
    static void Main()
    {
        var s = new Scores();
        s[0] = 90;
        s[1] = 75;
        Console.WriteLine(s[0] + ", " + s[1]);
    }
}

القراءة والكتابة من خلال المفهرس

عند توفير دالة وصول ودالة إسناد، يمكنك إسناد العناصر وقراءتها كما تفعل مع المصفوفة، بينما تتحكم الفئة في التخزين الأساسي.

using System;

class Grid
{
    private int[] _cells = new int[3];

    public int this[int i]
    {
        get => _cells[i];
        set => _cells[i] = value;
    }
}

class Program
{
    static void Main()
    {
        var g = new Grid();
        for (int i = 0; i < 3; i++) g[i] = i * 10;
        Console.WriteLine(g[0] + ", " + g[1] + ", " + g[2]);
    }
}

التحقق من الصحة في المفهرس

لأن المفهرس ليس سوى تعليمات برمجية، يمكنك التحقق من الفهرس وإلقاء خطأ واضح عند الوصول إلى موضع خارج النطاق.

using System;

class SafeList
{
    private int[] _data = new int[3];

    public int this[int i]
    {
        get
        {
            if (i < 0 || i >= _data.Length)
                throw new IndexOutOfRangeException("Bad index: " + i);
            return _data[i];
        }
        set { _data[i] = value; }
    }
}

class Program
{
    static void Main()
    {
        var list = new SafeList();
        list[1] = 42;
        Console.WriteLine(list[1]);
    }
}

المفهرسات ذات المفاتيح النصية

لا تقتصر معلمات المفهرس على int. إذ يحوّل المفتاح من النوع string فئتك إلى عملية بحث شبيهة بالقاموس.

using System;
using System.Collections.Generic;

class Config
{
    private Dictionary<string, string> _map = new Dictionary<string, string>();

    public string this[string key]
    {
        get => _map.ContainsKey(key) ? _map[key] : "(none)";
        set => _map[key] = value;
    }
}

class Program
{
    static void Main()
    {
        var c = new Config();
        c["theme"] = "dark";
        Console.WriteLine(c["theme"]);
        Console.WriteLine(c["missing"]);
    }
}

معلمات متعددة

يمكن أن يأخذ المفهرس أكثر من معلمة واحدة، وهو مثالي للمصفوفات أو الشبكات الثنائية الأبعاد التي يتم الوصول إليها باستخدام matrix[row, col].

using System;

class Matrix
{
    private int[,] _data = new int[2, 2];

    public int this[int row, int col]
    {
        get => _data[row, col];
        set => _data[row, col] = value;
    }
}

class Program
{
    static void Main()
    {
        var m = new Matrix();
        m[0, 0] = 1;
        m[1, 1] = 9;
        Console.WriteLine(m[0, 0] + ", " + m[1, 1]);
    }
}

المفهرسات للقراءة فقط

احذف دالة الإسناد لإنشاء مفهرس للقراءة فقط، يعرض البيانات من دون السماح بالتعديل الخارجي.

using System;

class Fibonacci
{
    public int this[int n]
    {
        get
        {
            int a = 0, bv = 1;
            for (int i = 0; i < n; i++)
            {
                int t = a + bv;
                a = bv;
                bv = t;
            }
            return a;
        }
    }
}

class Program
{
    static void Main()
    {
        var fib = new Fibonacci();
        Console.WriteLine(fib[7]);
    }
}

المفهرسات مقابل الخصائص

يتم الوصول إلى الخاصية بالاسم، مثل obj.Name، بينما يتم الوصول إلى المفهرس بالمفتاح، مثل obj[key]. استخدم المفهرس عندما يتصرف الكائن مثل مجموعة.

using System;

class Inventory
{
    private int[] _stock = new int[4];
    public int Total => _stock.Length;          // property
    public int this[int slot]                    // indexer
    {
        get => _stock[slot];
        set => _stock[slot] = value;
    }
}

class Program
{
    static void Main()
    {
        var inv = new Inventory();
        inv[2] = 15;
        Console.WriteLine("Slot 2: " + inv[2] + ", Total slots: " + inv.Total);
    }
}

المفهرسات المحمّلة زائدًا

يمكنك تعريف عدة مفهرسات ذات أنواع معلمات مختلفة، وسيختار المترجم المفهرس المطابق.

using System;
using System.Collections.Generic;

class People
{
    private List<string> _names = new List<string> { "Ann", "Bob", "Cara" };

    public string this[int i] => _names[i];
    public int this[string name] => _names.IndexOf(name);
}

class Program
{
    static void Main()
    {
        var p = new People();
        Console.WriteLine(p[1]);
        Console.WriteLine(p["Cara"]);
    }
}

تكرار كائن مفهرس

ادمج المفهرس مع خاصية للعدد للتكرار على مجموعة مخصصة بطريقة طبيعية.

using System;

class Ring
{
    private int[] _data = { 10, 20, 30 };
    public int Count => _data.Length;
    public int this[int i] => _data[i % _data.Length];
}

class Program
{
    static void Main()
    {
        var ring = new Ring();
        for (int i = 0; i < 5; i++)
            Console.Write(ring[i] + " ");
        Console.WriteLine();
    }
}

جمع العناصر معًا

تجعل المفهرسات فئات التغليف تبدو كمجموعات أصلية، إذ تخفي تفاصيل التخزين خلف صياغة الأقواس المربعة المألوفة.

using System;
using System.Collections.Generic;

class Phonebook
{
    private Dictionary<string, string> _book = new Dictionary<string, string>();

    public string this[string name]
    {
        get => _book.TryGetValue(name, out var num) ? num : "unknown";
        set => _book[name] = value;
    }
}

class Program
{
    static void Main()
    {
        var pb = new Phonebook();
        pb["Alice"] = "555-1234";
        Console.WriteLine("Alice: " + pb["Alice"]);
        Console.WriteLine("Zed: " + pb["Zed"]);
    }
}

تحقق سريع

اختبر فهمك للمفهرسات.

مراجعة

يستخدم المفهرس الصياغة this[...] لمنح الفئة وصولًا شبيهًا بالمصفوفات. وهو يدعم get/set وأي نوع من المعلمات، مثل int أو string أو المعلمات المتعددة، كما يدعم التحقق من الصحة والتحميل الزائد والصيغ المخصصة للقراءة فقط. استخدم المفهرسات للفئات التي تشبه المجموعات، والخصائص المسماة للسمات المنفصلة.

using System;

class Demo
{
    private int[] _v = new int[3];
    public int this[int i]
    {
        get => _v[i];
        set => _v[i] = value;
    }
}

class Program
{
    static void Main()
    {
        var d = new Demo();
        d[0] = 100;
        Console.WriteLine(d[0]);
    }
}

الأسئلة الشائعة

هل درس «المفهرسات» مجاني؟

نعم — نص درس «المفهرسات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «المفهرسات»؟

وصِلوا إلى الكائنات باستخدام صيغة شبيهة بالمصفوفات تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «المفهرسات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الخصائص المُطبَّقة تلقائيًا
  2. الخصائص الكاملة مع الحقول الداعمة
  3. الأعضاء ذات جسم التعبير
  4. المفهرسات
← العودة إلى C# Academy