• C# 索引器使用总结


    个人总结:

     

    C#属性
    1.属性的概念
    属性是个方法,主要是为面向对象封装而出现的
    2.属性的弊端
    切勿过度使用属性,属性会带来额外的问题
    不能将属性作为out和ref参数
    3.C#称有参数的属性为索引器,VB称为默认属性
    4.C#将this[...]作为表示索引器的语法。这种方法意味着只能在对象的实例上定义索引器
    5.C#索引器语法不允许程序员为他定义名称,名称是由C#编译团队为索引器定义的默认名称

    1、索引器(Indexer):

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

    最简单的索引器的使用

    复制代码
        /// <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();
            }
        }
    复制代码

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

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

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

    • 索引器允许重载

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

    • 索引器不是一个变量

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

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

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

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

    复制代码
        //以字符串为下标的索引器
        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();
            }
    }
    复制代码

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

    复制代码
        /// <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();
       }
    复制代码
  • 相关阅读:
    通过 phantomjs抓取仁医在线的练习题
    Fork/Join框架
    联表命中索引
    docker容器安装Vim
    docker 配合nginx部署vue项目
    docker安装与简单使用
    delphi IdHTTP 请求抓包分析
    delphi XML 文档注释
    关于Swing设置窗口图标后出现卡顿以及其他问题
    内部类和静态内部类的区别
  • 原文地址:https://www.cnblogs.com/kdp0213/p/8533374.html
Copyright © 2020-2023  润新知