因为基础不好,所以最近在看C#图解教程这本书,顺便做个笔记,网上有说好的,但是不敢肆意评判,看到索引器这部分感觉从来也没有使用过,很陌生就去
网上搜索了一下,下面我进行了标注,书上讲的点和博客园以为作者写的例子,我觉得代码这个东西真的是很强大,强大在于所有东西都要灵活引用。
再好的书也只能讲部分东西不能把所有处在书本外的实际运用的东西讲给你,下面做了基本的注释,留着以后查阅和理解。有什么不对的请大家指出。
注释:下面有一个网上例子4,对于构造函数使用的理解,无参构造函数必须要有的,接着说下一个有参构造函数的作用:EnterInfo类是个对象,如果我们不做一个构造
函数那么正常赋值是
EnterInfo dd = new EnterInfo() {
Num=1,
Depart="人事",
Name="张三"
};
向ArrayList中添加对象dd也是常用的办法,但是 arryList.Add(new EnterInfo("张三", 1, "人事"));这种直接调用类中构造方法更简洁,在这里感觉很合适,所以说我上面说到
代码方法的相互结合和灵活运用很重要,这里是个人的观点,不对的地方请指正,谢谢。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { /// <summary> /// 书上简单例子1 /// </summary> class MyClass { //定义变量 public string lastname; public string firstname; public string cityofbrith; //定义索引 //设置索引值,相当于指定一个值和相对应的变量,可以理解给每一个变量取了一个唯一的别名 public string this[int indexer] { set { switch (indexer) { case 0: firstname = value; break; case 1: lastname = value; break; case 2: cityofbrith = value; break; default: throw new ArgumentOutOfRangeException("indexer"); break; } } get { switch (indexer) { case 0: return firstname; case 1: return lastname; case 2: return cityofbrith; default: throw new ArgumentOutOfRangeException("indexer"); break; } } } } /// <summary> /// 书上简单例子2 /// </summary> class otherClass { //定义变量 private int temp0; private int temp1; //定义索引 //和上面的思想一致,只是上一种方法使用case、这种使用三目 public int this[int indexer] { get { return (0 == indexer) ? temp0 : temp1; } set { if (0 == indexer) temp0 = value; else temp1 = value; } } } /// <summary> /// 网上例子1 /// </summary> public class ArryIndex { //定义字符串数组,并只分配数组下标为0和1 private string[] strarr = new string[2]; //定义索引 //和上面的整体思想类似,只不过用数组生成的下标,而不是自定义的别名(数值) public string this[int indexer] { get { if (indexer < 2) { return strarr[indexer]; } return null; } set { if (indexer < 2) strarr[indexer] = value; } } } /// <summary> /// 网上例子2 /// </summary> public class struindex { //定义键值对集合 private Hashtable name = new Hashtable(); //定义索引,根据键来获取值 //indexer作为索引键,隐式的value值来自于我们调用时所赋予的值 public string this[string indexer] { get { return name[indexer].ToString(); } set { name.Add(indexer, value); } } } /// <summary> /// 网上例子3 /// </summary> public class overloadIndex { private Hashtable t = new Hashtable(); //索引的重载, // /// <summary> /// 根据键获取值 /// </summary> /// <param name="indexer"></param> /// <returns></returns> public string this[int indexer] { get { return t[indexer].ToString(); } set { t[indexer] = value; } } /// <summary> /// 根据值获取键 /// </summary> /// <param name="indexer"></param> /// <returns></returns> public int this[string indexer] { get {//Hashtable中实际存放的是DictionaryEntry(字典)类型,如果要遍历一个Hashtable,就需要使用到DictionaryEntry foreach (DictionaryEntry s in t) { if (s.Value.ToString() == indexer) { return Convert.ToInt32(s.Key); } } return -1; } set { t.Add(value, indexer); } } } /// <summary> /// 网上例子4 /// </summary> public class EnterInfo { private string name; private int num; private string depart; public EnterInfo() { } public EnterInfo(string _name, int _num, string _depert) { this.name = _name; this.num = _num; this.depart = _depert; } public string Name { get { return name; } set { name = value; } } public int Num { get { return num; } set { num = value; } } public string Depart { get { return depart; } set { depart = value; } } } public class IndexForEnterInfo { private ArrayList arryList; public IndexForEnterInfo() { arryList = new ArrayList(); } public string this[string name, int num] { get { foreach (EnterInfo s in arryList) { if (s.Name == name && s.Num == num) { return s.Depart; } } return null; } set { arryList.Add(new EnterInfo(name, num, value)); } } public ArrayList this[int indexer] { get { ArrayList temp = new ArrayList(); foreach (EnterInfo s in arryList) { if (s.Num == indexer) { temp.Add(s); } } return temp; } } } class Program { static void Main(string[] args) { #region 数组下标索引器 //索引器的使用 ArryIndex Indexer = new ArryIndex(); //“=”号右边对索引器赋值,其实就是调用其set方法 Indexer[0] = "张三"; Indexer[1] = "李四"; //输出索引器的值,其实就是调用其get方法 Console.WriteLine(Indexer[0]); Console.WriteLine(Indexer[1]); #endregion #region 以字符串作为下标,对索引器进行存取 struindex struindex = new struindex(); struindex["A0001"] = "张三"; struindex["A0002"] = "李四"; Console.WriteLine(struindex["A0001"]); Console.WriteLine(struindex["A0002"]); #endregion #region 重载索引器 overloadIndex overloadIndex = new overloadIndex(); //第一种索引器的使用 overloadIndex[1] = "张三";//set访问器的使用 overloadIndex[2] = "李四"; Console.WriteLine("编号为1的名字:" + overloadIndex[1]);//get访问器的使用 Console.WriteLine("编号为2的名字:" + overloadIndex[2]); Console.WriteLine(); //第二种索引器的使用 Console.WriteLine("张三的编号是:" + overloadIndex["张三"]);//get访问器的使用 Console.WriteLine("李四的编号是:" + overloadIndex["李四"]); overloadIndex["王五"] = 3;//set访问器的使用 Console.WriteLine("王五的编号是:" + overloadIndex["王五"]); #endregion #region 多参索引器 IndexForEnterInfo Info = new IndexForEnterInfo(); //this[string name, int num]的使用 Info["张三", 101] = "人事部"; Info["李四", 102] = "行政部"; Console.WriteLine(Info["张三", 101]); Console.WriteLine(Info["李四", 102]); Console.WriteLine(); //this[int num]的使用 foreach (EnterInfo en in Info[102]) { Console.WriteLine(en.Name); Console.WriteLine(en.Depart); } #endregion Console.WriteLine(); Console.ReadKey(); } } }