1、所有索引器至少要有一个参数,可以有更多,

2、索引器和属性 返回类型可以是除了void以外的任意类型

3、属性的各种用法同样适用于索引器。 此规则的唯一例外是“自动实现属性”。 编译器无法始终为索引器生成正确的存储。

4、C#使用数组风格的语法来公开有参属性,可以把索引器看作C#重载[]操作符的一种方式。//自己总结的

5、索引和属性都是函数,负责对私有字段进行操作的函数。属性是无参函数,索引是有参函数。//自己总结的

 



//
//Crtl+r,Ctrl+E 封装属性,直接生产
private string name;//Crtl+r,Ctrl+E 封装属性
public string Name { get => name; set => name = value; }//Crtl+r,Ctrl+E 直接生成


 

 




​ C# 索引器使用总结 ​


 




1、索引器(Indexer):

索引器允许类或者结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于他们的访问采用参数。

最简单的索引器的使用



C#索引器-有参属性C# 索引器使用总结_索引器

/// <summary>
/// 最简单的索引器
/// </summary>
public class IDXer
{
private string[] name=new string[10];

//索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
public string this[int index]
{
get
{
return name[index];
}
set
{
name[index] = value;
}
}
}

public class Program
{
static void Main(string[] args)
{
//最简单索引器的使用
IDXer indexer = new IDXer();
//“=”号右边对索引器赋值,其实就是调用其set方法
indexer[0] = "张三";
indexer[1] = "李四";
//输出索引器的值,其实就是调用其get方法
Console.WriteLine(indexer[0]);
Console.WriteLine(indexer[1]);
Console.ReadKey();
}
}


C#索引器-有参属性C# 索引器使用总结_数组_02


 2、索引器与数组的区别:

  • 索引器的索引值(Index)类型不限定为整数:

        用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型可以定义为其他类型。

  • 索引器允许重载

        一个类不限定为只能定义一个索引器,只要索引器的函数签名不同,就可以定义多个索引器,可以重载它的功能。

  • 索引器不是一个变量

        索引器没有直接定义数据存储的地方,而数组有。索引器具有Get和Set访问器。

3、索引器与属性的区别:

  • 索引器以函数签名方式 this 来标识,而属性采用名称来标识,名称可以任意
  • 索引器可以重载,而属性不能重载。
  • 索引器不能用static 来进行声明,而属性可以。索引器永远属于实例成员,因此不能声明为static。

以字符串作为下标,对索引器进行存取:



C#索引器-有参属性C# 索引器使用总结_数组_03

//以字符串为下标的索引器
public class IDXer2
{
private Hashtable name = new Hashtable();

//以字符串为下标的索引器
public string this[string index]
{
get
{
return name[index].ToString();
}
set
{
name.Add(index, value);
}
}
}

public class Program
{
static void Main(string[] args)
{
//以字符串为下标的索引器
IDXer2 indexer2 = new IDXer2();
indexer2["A01"] = "张三";
indexer2["A02"] = "李四";
Console.WriteLine(indexer2["A01"]);
Console.WriteLine(indexer2["A02"]);
Console.ReadKey();
}
}


C#索引器-有参属性C# 索引器使用总结_字符串_04


  多参数索引器及索引器的重载



C#索引器-有参属性C# 索引器使用总结_字符串_05

/// <summary>
/// 成绩类
/// </summary>
public class Scores
{
/// <summary>
/// 学生姓名
/// </summary>
public string StuName { get; set; }

/// <summary>
/// 课程ID
/// </summary>
public int CourseId { get; set; }

/// <summary>
/// 分数
/// </summary>
public int Score { get; set; }

}

/// <summary>
/// 查找成绩类(索引器)
/// </summary>
public class FindScore
{
private List<Scores> listScores;

public FindScore()
{
listScores = new List<Scores>();
}

//索引器 通过名字&课程编号查找和保存成绩
public int this[string stuName, int courseId]
{
get
{
Scores s = listScores.Find(x => x.StuName == stuName && x.CourseId == courseId);
if (s != null)
{
return s.Score;
}
else
{
return -1;
}
}
set
{
listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });
}
}

//索引器重载,根据名字查找所有成绩
public List<Scores> this[string stuName]
{
get
{
List<Scores> tempList = listScores.FindAll(x => x.StuName == stuName);
return tempList;
}
}
}

static void Main(string[] args)
{
//多参数索引器和索引器重载
FindScore fScore = new FindScore();
fScore["张三", 1] = 98;
fScore["张三", 2] = 100;
fScore["张三", 3] = 95;
fScore["李四", 1] = 96;
//查找 张三 课程编号2 的成绩
Console.WriteLine("李四 课程编号2 成绩为:" + fScore["李四", 1]);
//查找所有张三的成绩
List<Scores> listScores = fScore["张三"];
if (listScores.Count > 0)
{
foreach (Scores s in listScores)
{
Console.WriteLine(string.Format("张三 课程编号{0} 成绩为:{1}", s.CourseId, s.Score));
}
}
else
{
Console.WriteLine("无该学生成绩单");
}
Console.ReadKey();
}


C#索引器-有参属性C# 索引器使用总结_索引器_06


编程是个人爱好