כיצד לעבוד עם אינדקסים ב- C #

שפת התכנות C # כוללת תמיכה באינדקסים - תכונה המאפשרת לך להשתמש באובייקט בדיוק כמערך. אינדקסים ידועים גם כמערכים חכמים וניתן להגדיר אותם בדומה להגדרת נכס. ה- MSDN קובע: "אינדקסים מאפשרים להוסיף אינדקס למופעים של מחלקה או מבנה בדיוק כמו מערכים. אינדקסים דומים למאפיינים פרט לכך שהנגישים שלהם לוקחים פרמטרים."

אומנם לאינדקסים ולמאפיינים יש קווי דמיון ביותר מאחד, אך ישנם הבדלים עדינים ביניהם. שלא כמו מאפיינים, אתה יכול לגשת לאינדקס באמצעות אינדקסים. זכור שעליך לגשת לנכס באמצעות שמו. כמו כן, אינדקסים הם חברי מופע בכיתה ולכן הם לא יכולים להיות סטטיים. יכולות להיות לך מאפיינים סטטיים וגם לא סטטיים.

קטע הקוד הבא ממחיש כיצד מכריז על אינדקס:

this [argument list]

{

  get

  {

  }

  Set

  {

  }

}

שים לב שהמשנה כפי שמוצג בהצהרת התחביר של אינדקס יכול להיות פרטי, ציבורי, מוגן או פנימי.

שקול את הכיתה הבאה:

public class Contact

    {

        private string[] address = new string[3];

        public string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

כיתת אנשי הקשר מכילה חבר פרטי בשם כתובת ומגדירה אינדקס. חבר הכתובת הוא מערך של מחרוזת סוג. כך תוכל ליצור מופע של מחלקת אנשי הקשר ולהשתמש באינדקס.

Contact contact = new Contact();

 contact[0] = "Begumpet";

 contact[1] = "Hyderabad";

 contact[2] = "Telengana";

for (int i = 0; i < 3; i++)

Console.WriteLine (contact[i]);

יש לציין כי עליך להשתמש במילת המפתח "זה" כדי להגדיר אינדקסים. שים לב שאתה לא מוגבל להשתמש רק במספרים שלמים כאינדקסים לגישה לאינדקסים - אתה יכול אפילו להשתמש גם במנגנוני חיפוש אחרים. אינדקס משמש בדרך כלל כאשר הכיתה שלך מייצגת אוסף או אובייקטים. לאחר מכן תוכל להשתמש באינדקסר כדי לגשת לאלמנט ספציפי באמצעות אינדקס.

בואו ננסה דוגמה. שקול את המחלקה הבאה בשם לקוח.

public class Customer

    {

       public List Orders

        {

            get; set;

        }

       public Order this[int orderID]

        {

            get

            {

                return (from o in Orders

                        where o.OrderID == orderID

                        select o).First();

            }

        }

    }

מחלקת הלקוחות מגדירה אינדקס של סוג ההזמנה. הוא מכיל גם נכס ציבורי שהוא רשימה מסוג Order. הנה מחלקת ההזמנות לעיונך.

public class Order

    {

        public int OrderID

        {

            get; set;

        }

    }

קטע הקוד הבא ממחיש כיצד ניתן לגשת לאינדקסר של מחלקת הלקוחות כדי לאחזר הזמנה מסוימת.

   List lstOrder = new List();

  Order o1 = new Order();

  o1.OrderID = 1;

  Order o2 = new Order();

  o2.OrderID = 2;           

  lstOrder.Add(o1);

  lstOrder.Add(o2);

  Customer customer = new Customer();

  customer.Orders = lstOrder;

  Order o = customer[1];

עיין בקטע הקוד שלמעלה. שים לב כיצד נוצרה רשימה כללית מסוג Order שהוקצה למאפיין Orders של מופע של מחלקת הלקוחות. לאחר מכן, פשוט העבירו את OrderId כפרמטר לאחזור מופע ההזמנה הספציפי.

אינדקסים תומכים בירושה, יכולים להיות פולימורפיים ויכולים להיות מופשטים. שקול את המחלקה הבאה המגדירה אינדקס שהוא וירטואלי. מחלקת ContactBase היא גרסה שונה של מחלקת Contact שדנו בה קודם במאמר זה.

 public class ContactBase

    {

        protected string[] address = new string[3];

        public virtual string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

כעת אתה יכול להפיק מחלקה מהמחלקה ContactBase ולדרוס את האינדקס כפי שמוצג להלן.

public class ConcreteContact: ContactBase

    {

       public override string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

לכן, בדוגמת הקוד לעיל, בדקנו כיצד ניתן להשתמש באינדקסים תוך כדי בירושה של סוגים וכיצד הם יכולים להראות התנהגות פולימורפית.

אתה יכול באותה מידה להגדיר אינדקס כמופשט. לשם כך עליך ליצור מחלקה מופשטת ואז להגדיר אינדקס כמופשט בתוכו. בואו ונשנה את מחלקת ContactBase ונגדיר את האינדקסר כמופשט. כך תיראה כעת הגרסה המתוקנת של מחלקת ContactBase:

 public abstract class ContactBase

    {

        protected string[] address = new string[3];

        public abstract string this[int index]

        {

            get; set;

        }

}

אתה לא צריך לשנות את הכיתה ConcreteContact בכל מקרה. כעת תוכל למנף את האינדקס כדי להקצות ערכי מחרוזות למופע של מחלקת ConcreteContact כמוצג להלן.

ConcreteContact contact = new ConcreteContact();

contact[0] = "Begumpet";

contact[1] = "Hyderabad";

contact[2] = "Telengana";