2009-03-04 42 views
6

Việc sử dụng thực tế của chỉ mục trong C# là gì?Việc sử dụng Indexers là gì?

Có vẻ khá khó hiểu vì tôi là một lập trình viên C# mới. Nó trông giống như một mảng các đối tượng nhưng nó không phải.

Trả lời

8

Bạn có thể nghĩ một người lập chỉ mục là Thuộc tính có tham số. Việc bạn làm với thông số này là tùy thuộc vào bạn.

Nói chung, các chỉ mục được sử dụng khi cung cấp, tốt, một chỉ số cho đối tượng của bạn có ý nghĩa. Ví dụ: nếu đối tượng của bạn giao dịch với các bộ sưu tập các mặt hàng, có thể truy cập chúng bằng cú pháp đơn giản '[]' vì nó đơn giản để nghĩ nó như một mảng mà chúng tôi cung cấp vị trí của đối tượng mà chúng tôi muốn trở về.

Tôi đã viết một mục blog một thời gian trước đây về các khía cạnh của indexers using reflection.
Một trong những ví dụ tôi đưa là:

using System; 
using System.Collections; 

public class DayPlanner 
{ 
    // We store our indexer values in here 
    Hashtable _meetings = new System.Collections.Hashtable(); 

    // First indexer 
    public string this[DateTime date] { 
     get { 
      return _meetings[date] as string; 
     } 
     set { 
      _meetings[date] = value; 
     } 
    } 

    // Second indexer, overloads the first 
    public string this[string datestr] { 
     get { 
      return this[DateTime.Parse(datestr)] as string; 
     } 
     set { 
      this[DateTime.Parse(datestr)] = value; 
     } 
    } 
} 

Và sau đó bạn có thể sử dụng nó như thế này:

DayPlanner myDay = new DayPlanner(); 
    myDay[DateTime.Parse("2006/02/03")] = "Lunch"; 
    ... 
    string whatNow = myDay["2006/06/26"]; 

Đó chỉ là để hiển thị bạn có thể xoay Mục đích của một indexer để làm những gì bạn muốn .
Không có nghĩa là bạn nên ... :-)

0

Bất kỳ bộ sưu tập nào trong .NET, cho dù chúng là ArrayLists hoặc Danh sách chung, có, đằng sau mảng khung cảnh trong cấu trúc bên dưới của chúng. Các chỉ mục chỉ đơn thuần là một cách để thay đổi cách các chỉ mục mảng thông thường hoạt động, cho dù bằng cách chấp nhận các chuỗi làm đầu vào để tìm một đối tượng tương ứng với thuộc tính đó hoặc một số đầu vào khác. Nhưng, một lần nữa, bên dưới tất cả các đường cú pháp, nó vẫn kết thúc với một đại diện cho một mảng.

Điều này article might help explain how custom indexers are made.

Trên điểm thứ hai của bạn, Enums là số nguyên. Nếu bạn cần biểu diễn nhân vật của enums, bạn bị giới hạn thao tác chuỗi, hoặc bạn có thể decorate your enums with appropriate attributes để chúng sẽ phát ra chuỗi hoặc biểu diễn ký tự mong muốn của bạn.

1

Chỉ mục cho phép các lớp hoặc cấu trúc được lập chỉ mục giống như mảng, chúng thường được triển khai nhất trong các loại có mục đích chính là đóng gói bộ sưu tập nội bộ hoặc mảng.

Một get accessor trả về giá trị và một accessor bộ gán một giá trị:

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

Với sự đếm, họ được xác định giá trị này được giới hạn trong một nhóm nhỏ các loại nguyên thủy không thể thiếu (byte, SByte, ngắn, ushort , int, uint, long, ulong).

Kiểu char cũng là một loại không thể thiếu, nhưng nó khác với các loại không thể thiếu khác theo hai cách:

  • Không có chuyển đổi tiềm ẩn từ các loại khác để loại char. Đặc biệt, mặc dù các loại sbyte, byte và ushort có phạm vi giá trị được thể hiện đầy đủ bằng cách sử dụng loại char, chuyển đổi ngầm từ sbyte, byte hoặc ushort thành char không tồn tại.

  • Hằng số của loại char phải được viết dưới dạng ký tự chữ hoặc số nguyên-chữ cái kết hợp với dàn diễn viên để nhập char. Ví dụ, (char) 10 là giống như '\ x000A'.

(C# Language Specification 3.0, Section 4.1.5)

1

Mục đích của một indexer chỉ là nó hoạt động như một mảng, nhưng bạn chỉ định mã cho những gì đang xảy ra khi bạn đọc từ và ghi vào indexer.

Một người lập chỉ mục có thể thực hiện khá nhiều thứ để cung cấp một bộ sưu tập như behviour. Thông thường có một số loại bộ sưu tập riêng tư mà bạn cung cấp quyền truy cập đọc hoặc đọc/ghi để sử dụng trình chỉ mục.

Một enum không thể sử dụng char vì nó là loại hình cơ bản, nhưng bạn có thể sử dụng literals nhân vật để xác định một giá trị số nguyên:

public enum Characters : int { 
    Alpha = 'a', 
    Beta = 'b' 
} 

Characters.Alpha sẽ có giá trị 97, và Characters.Alpha.ToString () sẽ trả về chuỗi "Alpha". (char) Ký tự.Alpha cho giá trị 'a'.

Các vấn đề liên quan