有参属性
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 ScoreDictionary { get; set; }
}
class Score
{
private Dictionary _studentDictionary = new Dictionary();
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 { { 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["小红", "数学成绩"]);