什么时候应该使用C#索引器?

Ian*_*vis 16 c# indexer

我想更多地使用索引器,但我不确定何时使用它们.我在网上找到的都是使用类MyClass和的类的例子IndexerClass.

在有学生和教师的学校系统中,每个教师都有一份他们负责的学生名单 - 在这种情况下是否需要索引者?为简单起见,每个学生只能属于一名教师.

Has*_*req 7

Indexer是一个高度专业化的属性,它允许类(或结构)的实例像数组一样被索引(属性可以是静态的但索引器不能).

为什么要使用索引器:
- 而不是新的数据结构,类本身就是一个数据结构.
- 简化语法 - 句法糖

何时使用:
- 如果您的类需要其实例的列表(/数组)(示例1)
- 如果您的类表示与您的类直接相关的值的列表(/数组)(示例2)

例1:

public class Person{
    public string Name{get; set;}

    private Person[] _backingStore;
    public Person this[int index]
    {
        get{
            return _backingStore[index];
        }
        set{
            _backingStore[index] = value;
        }
    }
}

Person p = new Person();
p[0] = new Person(){Name = "Hassan"};
p[1] = new Person(){Name = "John Skeet"};    
Run Code Online (Sandbox Code Playgroud)

例2:

class TempratureRecord{
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 61.3F, 56.5F, 56.9F, 58.8F, 61.3F};

    public int Length{
        get { return temps.Length; }
    }

    public float this[int index]
    {
        get{
            return temps[index];
        }
        set{
            temps[index] = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Shi*_*ala 6

下面是我创建的视频http://www.youtube.com/watch?v=HdtEQqu0yOY,下面是对此相关的详细说明.

索引器有助于使用简化的界面在类中访问包含的集合.这是一种语法糖.

例如,假设您有一个包含地址集合的客户类.现在让我们说我们想要通过"Pincode"和"PhoneNumber"来获取地址集合.因此,逻辑步骤是你将创建两个重载函数,一个使用"PhoneNumber"获取,另一个通过"PinCode"获取.您可以在下面的代码中看到我们定义了两个函数.

Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");
Run Code Online (Sandbox Code Playgroud)

如果您使用索引器,则可以使用以下代码中所示的内容简化上述代码.

Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];
Run Code Online (Sandbox Code Playgroud)

干杯.


log*_*cnp 3

如果类表示对象的列表、集合或数组,则通常使用索引器。在您的情况下,您可以提供一个索引器来为教师的学生提供基于索引的访问。