• C# 索引器的使用


    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的。

    索引器和数组比较:

    (1)索引器的索引值(Index)类型不受限制

    (2)索引器允许重载

    (3)索引器不是一个变量

    索引器和属性的不同点

    (1)属性以名称来标识,索引器以函数形式标识

    (2)索引器可以被重载,属性不可以

    (3)索引器不能声明为static,属性可以

    一个简单的索引器例子

    using System;
    using System.Collections;
    
    public class IndexerClass { private string[] name = new string[2]; //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象 public string this[int index] { //实现索引器的get方法 get { if (index < 2) { return name[index]; } return null; } //实现索引器的set方法 set { if (index < 2) { name[index] = value; } } } } public class Test { static void Main() { //索引器的使用 IndexerClass Indexer = new IndexerClass(); //“=”号右边对索引器赋值,其实就是调用其set方法 Indexer[0] = "张三"; Indexer[1] = "李四"; //输出索引器的值,其实就是调用其get方法 Console.WriteLine(Indexer[0]); Console.WriteLine(Indexer[1]); } }

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

    public class IndexerClass
    {
        //用string作为索引器下标的时候,要用Hashtable
        private Hashtable name = new Hashtable();
    
        //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
        public string this[string index]
        {
            get { return name[index].ToString(); 
            set { name.Add(index, value); }
        }
    }
    public class Test
    {
        static void Main()
        {
            IndexerClass Indexer = new IndexerClass();
            Indexer["A0001"] = "张三";
            Indexer["A0002"] = "李四";
            Console.WriteLine(Indexer["A0001"]);
            Console.WriteLine(Indexer["A0002"]);
        }
    }

     索引器的重载

    public class IndexerClass
    {
        private Hashtable name = new Hashtable();
    
        //1:通过key存取Values
        public string this[int index]
        {
            get { return name[index].ToString(); }
            set { name.Add(index, value); }
        }
    
        //2:通过Values存取key
        public int this[string aName]
        {
            get
            {
                //Hashtable中实际存放的是DictionaryEntry(字典)类型,如果要遍历一个Hashtable,就需要使用到DictionaryEntry
                foreach(DictionaryEntry d in name)
                {
                    if (d.Value.ToString() == aName)
                    {
                        return Convert.ToInt32(d.Key);
                    }
                }
                return -1;
            }
            set
            {
                name.Add(value, aName);
            }
        }
    }
    public class Test
    {
        static void Main()
        {
            IndexerClass Indexer = new IndexerClass();
    
            //第一种索引器的使用
            Indexer[1] = "张三";//set访问器的使用
            Indexer[2] = "李四";
           Console.WriteLine("编号为1的名字:" + Indexer[1]);//get访问器的使用
            Console.WriteLine("编号为2的名字:" + Indexer[2]);
    
            Console.WriteLine();
            //第二种索引器的使用
            Console.WriteLine("张三的编号是:" + Indexer["张三"]);//get访问器的使用
            Console.WriteLine("李四的编号是:" + Indexer["李四"]);
           Indexer["王五"] = 3;//set访问器的使用
            Console.WriteLine("王五的编号是:" + Indexer["王五"]);
        }
    }

     多参索引器

    using System;
    using System.Collections;
    
    //入职信息类
    public class EntrantInfo
    {
        //姓名、编号、部门
        private string name;
        private int number;
        private string department;
        public EntrantInfo()
        {
    
        }
        public EntrantInfo(string name, int num, string department)
        {
            this.name = name;
            this.number = num;
            this.department = department;
        }
    
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    
        public int Num
        {
            get { return number; }
            set { number = value; }
        }
    
        public string Department
        {
            get { return department; }
            set { department = value; }
        }
    }
    
    //声明一个类EntrantInfo的索引器
    public class IndexerForEntrantInfo
    {
        private ArrayList ArrLst;//用于存放EntrantInfo类
        public IndexerForEntrantInfo()
        {
            ArrLst = new ArrayList();
        }
    
        //声明一个索引器:以名字和编号查找存取部门信息
        public string this[string name, int num]
        {
            get
            {
                foreach (EntrantInfo en in ArrLst)
                {
                    if (en.Name == name && en.Num == num)
                    {
                        return en.Department;
                    }
                }
                return null;
            }
            set
            {
                //new关键字:C#规定,实例化一个类或者调用类的构造函数时,必须使用new关键
                ArrLst.Add(new EntrantInfo(name, num, value));
            }
        }
    
        //声明一个索引器:以编号查找名字和部门
        public ArrayList this[int num]
        {
            get
            {
                ArrayList temp = new ArrayList();
                foreach (EntrantInfo en in ArrLst)
                {
                    if (en.Num == num)
                    {
                        temp.Add(en);
                    }
                }
                return temp;
            }
        }
    
        //还可以声明多个版本的索引器...
    }
    
    public class Test
    {
        static void Main()
        {
            IndexerForEntrantInfo Info = new IndexerForEntrantInfo();
            //this[string name, int num]的使用
            Info["张三", 101] = "人事部";
            Info["李四", 102] = "行政部";
            Console.WriteLine(Info["张三", 101]);
            Console.WriteLine(Info["李四", 102]);
    
            Console.WriteLine();
    
            //this[int num]的使用
            foreach (EntrantInfo en in Info[102])
            {
                Console.WriteLine(en.Name);
                Console.WriteLine(en.Department);
            }
        }
    }
     注:本文转载于http://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html
  • 相关阅读:
    设置display:flex后 flex布局设置单个子元素靠右
    wordpress独立站菜单导航设置教程
    javascript对象数组内元素排序
    好用的在线客服系统Go语言源码GOFLY ( 开源代码+安装教程)
    解决golang报错:imports github.com/gosqldriver/mysql from implicitly required module;
    多语言在线客服系统源码自动识别中英环境私有化部署完美支持跨境电商网站
    网页在线客服代码侧边悬浮在线客服/QQ/微信/电话代码
    在线客服系统源码开发实战总结:H5 Notifications浏览器桌面通知
    在线客服系统源码开发实战总结:gin框架模板渲染html页面
    wordpress网站主题安装教程
  • 原文地址:https://www.cnblogs.com/GISQZC/p/5222987.html
Copyright © 2020-2023  润新知