• 索引器


    索引器与属性的不同点:

      1、每个属性的名称必须唯一,而每一个索引器的签名必须唯一。

      2、索引器的“属性名”统一为this。而不能为其他,专门用于定义索引器。

      3、索引器的参数列表包含在方括号而不是圆括号之内。

      4、属性可以是静态的,而索引器只能为实例成员。

      5、属性的get访问器没有参数,而索引器的get访问器可以有参数,而且索引器的get访问器和set访问器的参数相同

      6、索引器可以有多个形参,比如访问多维数组时。

    索引器和数组对比:

                  数组          索引器

      索引类型        整型,0-n        可以为任意类型

      是否存储数据      是           否,通过访问器操作存在其他地方的数据,例如集合或数组字符串等。

      是否允许重载      否            是,一个类可以有多个索引器

    标准范例:

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                Index index = new Index();
                Console.WriteLine(index[1]);    //输出 刘备
                Console.WriteLine(index[2]);    //输出 关羽
                Console.WriteLine(index[3]);    //输出 张飞
    
                index[3] = "诸葛亮";
                Console.WriteLine(index[3]);    //输出 诸葛亮
    
                Console.ReadKey();
            }
        }
    
        public class Index
        {
            IDictionary<int, string> Dictionary = new Dictionary<int, string>
            {
                { 1,"刘备"},
                { 2,"关羽"},
                { 3,"张飞"},
            };
            public string this[int Id]
            {
                get
                {
                    if (Dictionary.ContainsKey(Id))
                        return Dictionary[Id];
                    throw new Exception("不存在对应的ID");
                }
                set
                {
                    if (Dictionary.ContainsKey(Id))
                        Dictionary[Id] = value;
                    else
                        throw new Exception("不存在对应的ID");
                }
            }
        }
    }
    View Code

    注意:当类中有[Item]这个属性名称时 使用索引器会导致一个编译错误

    错误    1    类型“ConsoleApp.BitArray”已经包含“Item”的定
    解决方案:
    C#允许我们通过在索引器上使用[System.Runtime.CompilerServices.IndexerName("索引名称")]这个特性来避免这种名称的冲突
    但是要注意当使用了IndexerName特性时 所有的索引器的名称 都必须一致 不然C#编译器就会报错。
    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp
    {
        class BitArray
        {
    
            private List<int> intList = new List<int>();
            public int Item { get; set; }
    
    
            [System.Runtime.CompilerServices.IndexerName("Bit")]
            public int this[int bitPos]
            {
                set
                {
                    intList[bitPos] = value;
                }
                get
                {
                    return intList[bitPos];
                }
            }
    
            //[System.Runtime.CompilerServices.IndexerName("Chars")]   如果使用的名称不一致 就会编译报错
            [System.Runtime.CompilerServices.IndexerName("Bit")]
            public int this[string str]
            {
                get { return 0; }
            }
        }
    
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.ReadLine();
            }
        }
    }
    View Code 
  • 相关阅读:
    小公司的10k前端工程师应该会什么?
    webService和Restful
    码农如何主动学习?
    20个Web前端开发工程师必看的国外网站
    网站主题和内容的三个类型
    HTTP慢速攻击
    Linux等待队列原理与实现
    签名你的每个 Git Commit
    浅谈 Linux 下常用 Socket 选项设置
    API接口设计,需要注意这4点
  • 原文地址:https://www.cnblogs.com/scmail81/p/8605259.html
Copyright © 2020-2023  润新知