Indexer trong lập trình C#

Đôi khi chúng ta chúng ta mong muốn truy cập một tập hợp bên trong một lớp như thể bản thân lớp là một mảng. Ví dụ, giả sử chúng ta tạo một điều khiển kiểu ListBox tên là myListBox chứa một danh sách các chuỗi lưu trữ trong một mảng một chiều, một biến thành viên private myStrings. Một List Box chứa các thuộc tính thành viên và những phương thức và thêm vào đó mảng chứa các chuỗi của nó. Tuy nhiên, có thể thuận tiện hơn nếu có thể truy cập mảng ListBox với chỉ mục như thể ListBox là một mảng thật sự. Ví dụ, ta có thể truy cập đối tượng ListBox được tạo ra như sau:
string chuoidau= myListBox[0];
string chuoicuoi= myListBox[myListBox.Length - 1];
Bộ chỉ mục là một cơ chế cho phép các thành phần client truy cập một tập hợp chứa bên trong một lớp bằng cách sử dụng cú pháp giống như truy cập mảng ([ ]). Chỉ mục là một loại thuộc tính đặc biệt và bao gồm các phương thức get()set() để xác nhận những hành vi của chúng.
Chúng ta có thể khai báo thuộc tính chỉ mục bên trong của lớp bằng cách sử dụng cú pháp như sau:
 this  [ <đối mục>]
{ get; set; }
Kiểu trả về được quyết định bởi kiểu của đối tượng được trả về bởi bộ chỉ mục, trong khi đó kiểu của đối mục được xác định bởi kiểu của đối mục dùng để làm chỉ số vào trong tập hợp chứa đối tượng đích. Mặc dù kiểu của chỉ mục thường dùng là các kiểu nguyên, chúng ta cũng có thể dùng chỉ mục cho tập hợp bằng các kiểu dữ liệu khác, như kiểu chuỗi. Chúng ta cũng có thể cung cấp bộ chỉ mục với nhiều tham số để tạo ra mảng đa chiều.

Từ khóa this tham chiếu đến đối tượng nơi mà chỉ mục xuất hiện. Như một thuộc tính bình thường, chúng ta cũng có thể định nghĩa phương thức get() và set() để xác định đối tượng nào trong mảng được yêu cầu truy cập hay thiết lập.
Ví dụ 9.9 khai báo một điều khiển ListBox, tên là ListBoxTest, đối tượng này chứa một mảng đơn giản (myStrings) và một chỉ mục để truy cập nội dung của mảng.

@Ghi chú: Đối với lập trình C++, bộ chỉ mục đưa ra giống như việc nạp chồng toán tử chỉ mục ([ ]) trong ngôn ngữ C++. Toán tử chỉ mục không được nạp chồng trong ngôn ngữ C#, và được thay thế bởi bộ chỉ mục.

Ví dụ :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace IndexersSample
{
    public class FileByteArray
    {
        Stream stream;      // Holds the underlying stream
        // used to access the file.
        // Create a new FileByteArray encapsulating a particular file.
        public FileByteArray(string fileName)
        {
            stream = new FileStream(fileName, FileMode.Open);
        }

        // Close the stream. This should be the last thing done
        // when you are finished.
        public void Close()
        {
            stream.Close();
            stream = null;
        }

        // Indexer to provide read/write access to the file.
        public byte this[long index]   // long is a 64-bit integer
        {
            // Read one byte at offset index and return it.
            get
            {
                byte[] buffer = new byte[1];
                //stream.Seek(index, SeekOrigin.Begin);
                stream.Seek(index, SeekOrigin.Begin);
                stream.Read(buffer, 0, 1);
                return buffer[0];
            }
            // Write one byte at offset index and return it.
            set
            {
                byte[] buffer = new byte[1] { value };
                stream.Seek(index, SeekOrigin.Begin);
                stream.Write(buffer, 0, 1);
            }
        }

        // Get the total length of the file.
        public long Length
        {
            get
            {
                return stream.Seek(0, SeekOrigin.End);
            }
        }
    }

    class IndexersSample
    {
        public static void Main(String[] args)
        {
          
            // Check for arguments.
            if (args.Length != 1)
            {
                Console.WriteLine("Usage : Indexer ");
                return;
            }

            // Check for file existence
            if (!System.IO.File.Exists(args[0]))
            {
                Console.WriteLine("File " + args[0] + " not found.");
                return;
            }

            FileByteArray file = new FileByteArray(args[0]);
            long len = file.Length;

            // Swap bytes in the file to reverse it.
            for (long i = 0; i < len / 2; ++i)
            {
                byte t;

                // Note that indexing the "file" variable invokes the
                // indexer on the FileByteStream class, which reads
                // and writes the bytes in the file.
                t = file[i];
                file[i] = file[len - i - 1];
                file[len - i - 1] = t;
            }

            file.Close();
        } 
    }
}

Không có nhận xét nào :

Đăng nhận xét