C#索引器的用法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44800780/article/details/102727309

什么是索引器

属性被视为一种智能字段;类似地,索引器可被视为智能数组,它的本质是有参属性。属性封装一个值,索引器封装一组值。
下面是一个例子:
假如我们要将int作为一个由32个二进制位构成的数组使用,该怎么办?
比如说,假如bits是int,我们想把它第1位设置位true,我们希望可以这样写:
bits[0] = true;
但是不能位int使用方括号记号法。该记号法仅仅适合数组或行为与数组相似的类似。为了解决这个问题,我们可以使用索引器。

    struct IntBits
    {
        private int bits;
        public IntBits(int initialBitValue) => bits = initialBitValue;
        public bool this[int index]
        {
            get => (bits & (1 << index)) != 0;
            set
            {
                if (value)
                    bits |= (1 << index);
                else
                    bits &= ~(1 << index);
            }
        }
    }

定义索引器需要this关键字。在this之前指定索引器的返回值类型.
上面的IntBits结构的索引器用整数作为索引类型,返回bool值.
注意:
1.索引器不是方法-没有包含参数的圆括号,但有了指定索引的方括号.(事实上还是方法,编译器编译的时候会自动把它转换成在内部使用的方法,详情可以看CLR via C#).
2.所有索引器都使用this关键字取代方法名,每个类或结构只允许定义1个索引器,而且总是命名为this.
3.和属性一样, 索引器也包含get和set这两个访问器.
4.索引器声明中指定的index将用调用索引器时指定的索引值来填充.

            int temp = 0b0_01111110;
            IntBits bits = new IntBits(temp);
            bool a = bits[6];
            bits[0] = true;



理解索引器的访问器

读取索引器时,编译器自动将数组风格的代码转换成对那个索引器的get访问器的调用.
类似地,向索引器写入也是一样的。

对比索引器和数组

1.索引器能使用非数组下标,数组只能使用整数下标.
2.索引器能重载,数组不能.
3.索引器不能作为ref 或out参数使用,数组元素能

接口中的索引器

接口可以声明索引器
比如:

    interface IRawInt
    {
        bool this[int index] { get; set; }
    }

猜你喜欢

转载自blog.csdn.net/qq_44800780/article/details/102727309