总结

只要类中有类似于属性的元素就应创建索引器,此属性代表的不是一个值,而是值的集合,其中每一个项由一组参数标识。 这些参数可以唯一标识应引用的集合中的项。 索引器延伸了属性的概念,索引器中的一个成员被视为类外部的一个数据项,但又类似于内部的一个方法。 索引器允许参数在代表项的集合的属性中查找单个项。

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

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

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

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

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

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

C# 索引器使用总结

 

1、索引器(Indexer):

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

最简单的索引器的使用

  1. /// <summary>
  2. /// 最简单的索引器
  3. /// </summary>
  4. public class IDXer
  5. {
  6. private string[] name=new string[10];
  7.  
  8. //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
  9. public string this[int index]
  10. {
  11. get
  12. {
  13. return name[index];
  14. }
  15. set
  16. {
  17. name[index] = value;
  18. }
  19. }
  20. }
  21.  
  22. public class Program
  23. {
  24. static void Main(string[] args)
  25. {
  26. //最简单索引器的使用
  27. IDXer indexer = new IDXer();
  28. //“=”号右边对索引器赋值,其实就是调用其set方法
  29. indexer[0] = "张三";
  30. indexer[1] = "李四";
  31. //输出索引器的值,其实就是调用其get方法
  32. Console.WriteLine(indexer[0]);
  33. Console.WriteLine(indexer[1]);
  34. Console.ReadKey();
  35. }
  36. }

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

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

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

  • 索引器允许重载

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

  • 索引器不是一个变量

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

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

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

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

  1. //以字符串为下标的索引器
  2. public class IDXer2
  3. {
  4. private Hashtable name = new Hashtable();
  5.  
  6. //以字符串为下标的索引器
  7. public string this[string index]
  8. {
  9. get
  10. {
  11. return name[index].ToString();
  12. }
  13. set
  14. {
  15. name.Add(index, value);
  16. }
  17. }
  18. }
  19.  
  20. public class Program
  21. {
  22. static void Main(string[] args)
  23. {
  24. //以字符串为下标的索引器
  25. IDXer2 indexer2 = new IDXer2();
  26. indexer2["A01"] = "张三";
  27. indexer2["A02"] = "李四";
  28. Console.WriteLine(indexer2["A01"]);
  29. Console.WriteLine(indexer2["A02"]);
  30. Console.ReadKey();
  31. }
    }

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

  1. /// <summary>
  2. /// 成绩类
  3. /// </summary>
  4. public class Scores
  5. {
  6. /// <summary>
  7. /// 学生姓名
  8. /// </summary>
  9. public string StuName { get; set; }
  10.  
  11. /// <summary>
  12. /// 课程ID
  13. /// </summary>
  14. public int CourseId { get; set; }
  15.  
  16. /// <summary>
  17. /// 分数
  18. /// </summary>
  19. public int Score { get; set; }
  20.  
  21. }
  22.  
  23. /// <summary>
  24. /// 查找成绩类(索引器)
  25. /// </summary>
  26. public class FindScore
  27. {
  28. private List<Scores> listScores;
  29.  
  30. public FindScore()
  31. {
  32. listScores = new List<Scores>();
  33. }
  34.  
  35. //索引器 通过名字&课程编号查找和保存成绩
  36. public int this[string stuName, int courseId]
  37. {
  38. get
  39. {
  40. Scores s = listScores.Find(x => x.StuName == stuName && x.CourseId == courseId);
  41. if (s != null)
  42. {
  43. return s.Score;
  44. }
  45. else
  46. {
  47. return -1;
  48. }
  49. }
  50. set
  51. {
  52. listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });
  53. }
  54. }
  55.  
  56. //索引器重载,根据名字查找所有成绩
  57. public List<Scores> this[string stuName]
  58. {
  59. get
  60. {
  61. List<Scores> tempList = listScores.FindAll(x => x.StuName == stuName);
  62. return tempList;
  63. }
  64. }
  65. }
  66.  
  67. static void Main(string[] args)
  68. {
  69. //多参数索引器和索引器重载
  70. FindScore fScore = new FindScore();
  71. fScore["张三", 1] = 98;
  72. fScore["张三", 2] = 100;
  73. fScore["张三", 3] = 95;
  74. fScore["李四", 1] = 96;
  75. //查找 张三 课程编号2 的成绩
  76. Console.WriteLine("李四 课程编号2 成绩为:" + fScore["李四", 1]);
  77. //查找所有张三的成绩
  78. List<Scores> listScores = fScore["张三"];
  79. if (listScores.Count > 0)
  80. {
  81. foreach (Scores s in listScores)
  82. {
  83. Console.WriteLine(string.Format("张三 课程编号{0} 成绩为:{1}", s.CourseId, s.Score));
  84. }
  85. }
  86. else
  87. {
  88. Console.WriteLine("无该学生成绩单");
  89. }
  90. Console.ReadKey();
  91. }
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
 

C#索引器-有参属性的更多相关文章

  1. C#索引器的作用及使用

    1. 作用: 可以使得类和实例能够像数组那样使用一样,又称为带参属性 2. 区分 (1)索引器与数组的比较: 索引器的索引值不受类型限制.用来访问数组的索引值一定是整数,而索引器可以是其他类型的索引值 ...

  2. C# 类中索引器的使用

    索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...

  3. WPF绑定之索引器值变化通知

    背景 在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新. 解决方案 只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyCha ...

  4. 《精通C#》索引器与重载操作符(11.1-11.2)

    1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...

  5. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

    不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...

  6. C# 类中索引器的使用二

    索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...

  7. c# 索引器方法

    索引器方法允许我们构建能够以类似访问数组的语法来访问内部子类型的自定义类型 在语法上索引器方法和属性的定义很类似,一样是使用get,set,不同的是索引器是使用this[]创建的. 一个简单的索引器代 ...

  8. C# 索引器简介

    索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,是程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了数组和集合成员时,索引器 ...

  9. Asp.Net中索引器的用法

    索引器定义类似于属性,但其功能与属性并不相同.索引器提供一种特殊的方法编写get和set访问器.属性可以像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员. 一.索引器特性 1.g ...

随机推荐

  1. gin框架中的路由拆分与注册

    基本的路由注册 下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo. package main import ( "net/http" "gi ...

  2. 微信小程序入门教程之四:API 使用

    今天是这个系列教程的最后一篇. 上一篇教程介绍了,小程序页面如何使用 JavaScript 脚本.有了脚本以后,就可以调用微信提供的各种能力(即微信 API),从而做出千变万化的页面.本篇就介绍怎么使 ...

  3. Django settings.py配置文件

    import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 这里用到了python中一个神奇的变量 file 这个变量可以获取到当前 ...

  4. Linux 学习2

    1.配置好阿里云yum源生成yum缓存下载nginx,并且启动nginx服务,使用浏览器访问,nginx页面 yum源的工作目录是? https://www.cnblogs.com/dlh-lmsh/ ...

  5. SpringBoot集成druid数据库连接池的简单使用

    简介 Druid是阿里巴巴旗下Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能. 官网: https://github.com/alibaba/druid/wiki/常见问题 ...

  6. <select><option></option></select> 操作

    转载请注明来源:https://www.cnblogs.com/hookjc/ function FlySwapSelect(s1,s2,myvars,calldbclick){ var mSel1= ...

  7. 解决tomcat同时部署两个SpringBoot应用报异常InstanceAlreadyExistsException

    问题描述:Caused by: javax.management.InstanceAlreadyExistsException: com.alibaba.druid.pool:name=primary ...

  8. Java开发环境及工具安装配置

    Java开发环境及工具安装配置 Windows JDK 下载地址 https://www.oracle.com/java/technologies/javase-downloads.html 安装配置 ...

  9. 认识Visual C++ 6.0工程结构

  10. 抽象修饰符abstract

    描述一类事物的时候发现该类存在一种行为,但不知道行为具体怎么实现,我们将这种行为称之为抽象行为,这时候我们就需要抽象类 抽象类的好处:抽象类中的抽象方法一定要备子类重写 抽象类注意点: 1.在类中,一 ...