Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Tìm hiểu Indexer trong lập trình C#

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Talking Tìm hiểu Indexer trong lập trình C#

    Đôi lúc, bạn muốn truy xuất một tập hợp nằm trong lòng một class xem bản thân class này như là 1 mảng. Ví dụ, giả sử bạn tạo một ô liệt kê (listbox) mang tên myListBox, chứa một danh sách những chuỗi chữ được trữ trên một mảng một chiều, và một biến thành viên private mang tên myStrings. Thông thường, một listbox thường có một số phương thức và thuộc tính ngoài mảng chuỗi. Tuy nhiên, sẽ rất tiện lợi nếu ta có khả năng truy xuất listbox với một chỉ mục, coi listbox như là một mảng. Ví dụ, một thuộc tính như thế cho phép ta viết ra những câu lệnh sau:

    Visual C# Code:
    1.     string chuoiDau = myListBox[0];
    2.     string chuoiCuoi = myListBox[Length-1];

    Nói tóm lại, indexer là một sáng tạo của C# cho phép bạn truy xuất những tập hợp nằm trong lòng một lớp, sử dụng cú pháp [] thông dụng của mảng. Indexer được xem như là một thuộc tính khá đặc biệt kèm theo những phương thức get() và set(). Khai báo một indexer cho phép bạn tạo những class hoặc struct hoạt động tương tự như “mảng ảo”. Những thể hiện của lớp này có thể được truy sử dụng tác tử truy xuất mảng [].

    Vậy ta phải khai báo Indexer như thế nào? Bạn khai báo một thuộc tính indexer trong lòng một class, sử dụng cú pháp tựa như sau:


    Visual C# Code:
    1.     type this[type argument]  { get; set; }


    Kiểu dữ liệu type: được trả về xác định kiểu đối tượng mà indexer sẽ trả về.
    type argument: cho biết loại đối mục nào sẽ được dùng đến để chỉ mục trên tập hợp chứa các đối tượng đích.
    Từ khóa this là một qui chiếu về đối tượng theo đấy indexer sẽ xuất hiện.
    Phần thân get() của indexer cũng giống phần thân của một phương thức thông thường:


    Visual C# Code:
    1.     get
    2.     {
    3.         return myArray[index];
    4.     }


    Phần thân set() của indexer cũng giống phần thân của phương thức thông thường


    Visual C# Code:
    1.     set
    2.     {
    3.          myArray[index] = value;
    4.     }



    Sau đây là ví dụ về Indexer:

    Đầu tiên, ta khai báo một class ListBoxTest



    Visual C# Code:
    1.  class ListBoxTest
    2.         {
    3.             //thuoc tinh
    4.             private string[] myStrings; //mảng chuỗi
    5.             private int myCtr = 0; //biến kiểm tra số chuỗi chữ
    6.             //constructor
    7.             public ListBoxTest(params string[] initialStrings)
    8.             {
    9.                 //tạo 1 mảng 256 chuỗi
    10.                myStrings = new string[256];
    11.                //khởi gán giá trị cho các chuỗi đó
    12.                foreach (string s in initialStrings)
    13.                {
    14.                    myStrings[myCtr++] = s;
    15.                }
    16.            }
    17.            //phương thức này để thêm một chuỗi bất kỳ
    18.            //vào mảng các chuỗi của class ListBoxTest
    19.            public void Add(string sChuoi)
    20.            {
    21.                if (myCtr >= myStrings.Length)
    22.                {
    23.                    //xử lý chỉ mục ở đây
    24.                }
    25.                else
    26.                    myStrings[myCtr++] = sChuoi;
    27.            }
    28.            //INDEXER:
    29.            public string this[int index]
    30.            {
    31.                get
    32.                {
    33.                    if (index < 0 || index > myStrings.Length)
    34.                    {
    35.                        //xử lý chỉ mục
    36.                    }
    37.                    return myStrings[index];
    38.                }
    39.                set
    40.                {
    41.                    if (index >= myCtr)
    42.                    {
    43.                        //xử lý chỉ mục
    44.                    }
    45.                    else
    46.                        myStrings[index] = value;
    47.                }
    48.            }
    49.            //phương thức này trả về chỉ mục kiểm soát của class
    50.            public int GetNumEntries()
    51.            {
    52.                return myCtr;
    53.            }
    54.        }


    Bây giờ, trong thân phương thức Main, ta làm vài đoạn code DEMO để ví dụ:


    Visual C# Code:
    1.  class Program
    2.         {
    3.             static void Main(string[] args)
    4.             {
    5.                 //tạo một đối tượng thể hiện của class ListBoxTest
    6.                 //và khởi gán 4 chuỗi: "Xin","Chao","Ba","Con"
    7.                 //như là đối số
    8.                 ListBoxTest lbt = new ListBoxTest("Xin", "Chao", "Ba", "Con");
    9.                 //thêm 3 chuỗi nữa
    10.                lbt.Add("Moi nguoi");
    11.                lbt.Add("manh khoe chu?");
    12.                lbt[1] = "neverland87"; //myStrings[1] = "neverland87"
    13.                //đi xuyên qua đối tượng lbt
    14.                //và in ra các chuỗi mà nó nắm giữ
    15.                //dựa và chỉ mục
    16.                for (int i = 0; i < lbt.GetNumEntries(); i++)
    17.                {
    18.                    Console.WriteLine("lbt[{0}]:{1}", i, lbt[i]);
    19.                }
    20.            }
    21.        }


    Điều đầu tiên, bạn để ý là hai biến thành viên private:
    Visual C# Code:
    1.  
    2.     private string[] myStrings; //mảng chuỗi
    3.     private int myCtr = 0; //biến kiểm soát chỉ mục


    Trong chương trình này, listbox duy trì một mảng các chuỗi chữ myStrings. Thật ra, thực tế listbox có thể sẽ có một mảng linh động chẳng hạn. Biến myCtr dùng theo dõi bao nhiêu chuỗi chữ đã được đưa vào.
    Phương thức chủ chốt của ListBoxTest là indexer. Indexer sẽ không mang tên, do đó bạn sử dụng từ khóa this:


    Visual C# Code:
    1.     public string this[int index]

    Tác giả: neverland
    Keep moving forward!

    ... Retired ...

  2. #2
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Nói tóm lại, indexer là một sáng tạo của C# cho phép bạn truy xuất những tập hợp nằm trong lòng một lớp
    (neverland - caulacbovb)[/QUOTE]
    bạn ơi cho mình hỏi
    nếu 1 class của mình không có các thuộc tính kiểu như mảng thì không cái đặt indexer?

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    6

    Tùy bạn ah. Thuong thì ltv dùng indexer cho tiện thao tác và xủ lý.Tuy nhiên nếu ko cần thiết thì OOP bình thuong cũng ko sao

  4. #4
    Ngày gia nhập
    09 2008
    Bài viết
    1

    Mình mới tìm hiểu về C# vừa mới đọc đến chỉ muc. Nhưng nhiều chỗ mình chưa hiểu lắm. Mong các bác chỉ giúp cho.
    Như ở ví dụ trên ta đã tạo ra mảng cho thể hiện lớp rồi.
    myStrings= new string[256]
    Vậy việc sử dụng chỉ mục ở đây có tác dụng gì.
    Và sử dụng chỉ mục này để truy xuất ra một tập hợp nằm trong lòng một lớp.
    Như trong ví dụ trên đầu tiên ta tạo ra một thể hiện cho lớp ListBoxTest. với 4 chuối "Xin", "Chao", "Ba" ,"Con". Sau đó ta add thêm các chuỗi vào. Vậy thì khi mà truy xuất các chuối ra dựa vào chỉ mục thì ở đây chỉ mục hoạt động ra sao.
    Chỉ mục thường đựoc dùng trong hoàn cành nào thì tiện lơi.
    Mình là newbie nên gà lắm mong các bạn chỉ giúp. Cảm ơn nhiều

  5. #5
    Ngày gia nhập
    04 2011
    Bài viết
    1

    Cho hỏ có thể dùng indexer trong các loại tập hợp như List đc ko?
    Nếu đc thì dùng như thế nào?
    Thank?

Các đề tài tương tự

  1. lỗi Property or indexer '...Control.Right' cannot be assigned to -- it is read only
    Gửi bởi thaibeo17 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 04-07-2011, 11:32 AM
  2. indexer trong C#, giúp mình
    Gửi bởi chungmo trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 13-10-2010, 10:39 AM
  3. xin mọi người chỉ giáo về C #(indexer)
    Gửi bởi luciachi trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 15-03-2009, 03:43 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn