索引器

有参属性

get访问器接受一个或多个参数,set访问器接受两个或多个参数,在C#中也叫索引器。

索引器基本结构
返回类型 this[参数]{ get; set; }
声明索引器
class Test
{
     //声明接受int型参数并返回int值的索引器
     public int this[int index]
     {
         get
         {
            return 0;
         }
     }
}
索引器的参数和返回类型不允许是void类型
//错误,参数类型无效
public int this[void index]
{
    get { 省略... }
}

//错误,索引器不能有void类型
public void this[int index]
{
    get { 省略... }
}
索引器至少需要一个参数
//错误,索引器必须至少需要一个参数
public int this[]
{
    get { 省略... }
}
索引器只能是实例成员,不能作为静态成员
class Test
{
     //错误,static无效
     public static int this[int index]
     {
        get { 省略... }
     }
}

static class Test
{
     //错误,不能再静态类中声明索引器
     public int this[int index]
     {
        get { 省略... }
     }
}
索引器可以重载
class Test
{
     //正确
     public int this[int index]
     {
        get { 省略... }
     }
     
     //正确,参数类型不同,重载索引器
     public int this[string value]
     {
        get { 省略... }
     }
}
相同签名的索引器只允许有一个
class Test
{
     //正确
     public int this[int index]
     {
        get { 省略... }
     }
     
     //错误,已经定义了一个名为this且具有相同参数类型的成员
     public string this[int value]
     {
        get { 省略... }
     }
}

定义一个Position类,拥有成员(无参属性):x, y, z

class Position
{
     public float X { get; set; }
     public float Y { get; set; }
     public float Z { get; set; }
}

进行访问或修改的方法

Position pos = new Position
{
     X = 10,
     Y = 10,
     Z = 10
};
Console.WriteLine("x={0},y={1},z={2}", pos.X, pos.Y, pos.Z);

使用索引器重写,允许用访问数组的方式访问pos对象的x,y,z成员

class Position
{
     private float x;
     private float y;
     private float z;
    public float this[int index]
    {
        get
        {
            switch (index)
            {
                 case 1:
                    return this.x;
                 case 2:
                    return this.y;
                 case 3:
                    return this.z;
                 default:
                    return -1;
            }
        }
        set
        {
            switch (index)
            {
                case 1:
                    this.x = value;
                    break;
                case 2:
                     this.y = value;
                     break;
                case 3:
                    this.z = value;
                    break;
            }
        }
    }
}

使用方式

Position pos = new Position();
pos[1] = 10;
pos[2] = 10;
pos[3] = 10;
Console.WriteLine("x={0},y={1},z={2}", pos[1], pos[2], pos[3]);

也可以改变索引器的参数类型,使程序支持pos["x"]这种使用方式,同时也体现出索引器与数组的不同: 数组的索引值类型必须使整型,而索引器的索引值类型可以自定义

public float this[string key]
{
    get
    {
        switch (key)
        {
            case "x": return this.x;
            case "y": 省略...
            case "z": 省略...
            default:  省略...
        }
    }
    set
    {
        switch (key)
        {
            case "x":
                this.x = value;
                break;
            case "y": 省略...
            case "z": 省略...
        }
    }
}
//调用
Position pos = new Position();
pos["x"] = 10;
Console.WriteLine("x={0}", pos["x"]);

多参数索引器实现一个分数类,通过索引学生名与学科名便能得到该学生该学科成绩,如: Score["小明", "语文"]得到小明的语文成绩

class Student
{
    public Dictionary<string, int> ScoreDictionary { get; set; }
}

class Score
{
    private Dictionary<string, Student> _studentDictionary = new Dictionary<string, Student>();
    public int this[string name, string subject]
    {
        get
        {
            Student student;
            if (this._studentDictionary.TryGetValue(name, out student))
            {
                int score;
                if (student.ScoreDictionary.TryGetValue(subject, out score))
                    return score;
            }
            return -1;
        }
        set
        {
            if (this._studentDictionary.ContainsKey(name))
            {
                Student student = this._studentDictionary[name];
                if (student.ScoreDictionary.ContainsKey(subject))
                    student.ScoreDictionary[subject] = value;
                else
                    student.ScoreDictionary.Add(subject, value);
                return;
            }
            this._studentDictionary.Add(name, new Student
            {
                ScoreDictionary = new Dictionary<string, int> { { subject, value } }
            });
        }
    }
}

调用方法

Score score = new Score();
score["小明", "语文成绩"] = 80;
score["小明", "数学成绩"] = 90;
score["小红", "语文成绩"] = 70;
score["小红", "数学成绩"] = 60;
Console.WriteLine("小明语文成绩={0},小红语文成绩={1}", score["小明", "语文成绩"], score["小红", "语文成绩"]);
Console.WriteLine("小明数学成绩={0},小红数学成绩={1}", score["小明", "数学成绩"], score["小红", "数学成绩"]);
阅读 77

推荐阅读