C# 索引器

C# 索引器(Indexer)

索引器(Indexer) 允许一个对象可以像数组一样被索引。当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。您可以使用数组访问运算符([ ])来访问该类的实例。

语法

一维索引器的语法如下:

element-type this[int index]
{
   // get 访问器
   get
   {
      // 返回 index 指定的值
   }

   // set 访问器
   set
   {
      // 设置 index 指定的值
   }
}

 

索引器(Indexer)的用途

索引器的行为的声明在某种程度上类似于属性(property)。就像属性(property),您可使用 get 和 set 访问器来定义索引器。但是,属性返回或设置一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。换句话说,它把实例数据分为更小的部分,并索引每个部分,获取或设置每个部分。

定义一个属性(property)包括提供属性名称。索引器定义的时候不带有名称,但带有 this 关键字,它指向对象实例。

class Val
        {
            private string type = "";
            private int parseId;
            public Val()
            {
                type = "default";
                parseId = 114514;
            }
            public string getType()
            {
                return type;
            }
            //主要是用来维护数组...吧
            public string this[int id]{
                set {
                    //模拟解析id...
                    type = $"title:{value}=";
                    if (id % 2 == 0)
                    {
                        type += "video";
                    }
                    else
                    {
                        type +="article";
                    }
                }
                get{
                    //因为这里没有维护一个数组,所以这两个方法并没有体现出来具体用处
                    return type;
                }
            }
            public static bool operator !=(Val va, Val vb)
            {
                if (va.getType().Equals(vb.getType()))
                {
                    return false;
                }
                return true;
            }
            public static bool operator ==(Val va,Val vb)
            {
                if (va.getType().Equals(vb.getType()))
                {
                    return true;
                }
                return false;
            }
        }
        public static void run()
        {
            Val valA = new Val();
            valA[233] = "wtf this article";
            Console.WriteLine(valA.getType());
            Val valB = new Val();
            valB[234] = "wtf this video";
            Console.WriteLine(valB.getType());
            Console.WriteLine(valA==valB);
        }

//果然还是写个正常的索引器使用例子比较好

 

重载索引器(Indexer)

索引器(Indexer)可被重载。索引器声明的时候也可带有多个参数,且每个参数可以是不同的类型。没有必要让索引器必须是整型的。C# 允许索引器可以是其他类型,例如,字符串类型。

 

 class Vals
        {
            int[] values;
            string[] names;
            int size;
            public Vals()
            {
                size = 10;
                names = new string[10];
                values = new int[10];
            }
            public string this[int index]
            {
                set
                {
                    if (index < 0 || index > size - 1) { return; }
                    names[index] = value;
                }
                get
                {
                    return names[index];
                }
            }
            public int this[string key]
            {
                get
                {
                    for(int i=0;i<size;i++)
                    {
                        if (key.Equals(names[i]))
                        {
                            return values[i];
                        }
                    }
                    return -1;
                }
                set
                {
                    for (int i = 0; i < size; i++)
                    {
                        if (key.Equals(names[i]))
                        {
                            values[i]= value;
                        }
                    }
                }
            }
        }
        public static void run()
        {
            Val valA = new Val();
            valA[233] = "wtf this article";
            Console.WriteLine(valA.getType());
            Val valB = new Val();
            valB[234] = "wtf this video";
            Console.WriteLine(valB.getType());
            Console.WriteLine(valA==valB);
            Vals vals = new Vals();
            vals[0]= "anyname";
            vals["anyname"]= 114514;
            vals[1] = "testname";
            vals["testname"] = 36942;
            Console.WriteLine(vals["anyname"]);
            Console.WriteLine(vals["noname"]);
        }

 

C# 索引器

上一篇:Windows编译opencv源码


下一篇:C# Net WinForm 全屏,不带任务栏,带任务栏