Indexers 索引子

 

Indexers 索引子

using System;

namespace ConsoleApp1
{
    class Test
    {
        // Define the indexer to allow client code to use [] notation.
        public string this[string i]
        {
            get
            {
                return i;
            }
        }

        public int this[int i]
        {
            get
            {
                return i;
            }
        }

        // use Expression body
        public string this[bool i] => i.ToString();
    }

    class Program
    {
        static void Main(string[] args)
        {
            var stringCollection = new Test();

            string a = stringCollection["aaa"];
            Console.WriteLine(a);

            int b = stringCollection[100];
            Console.WriteLine(b);

            string c = stringCollection[true];
            Console.WriteLine(c);
            
            Console.ReadKey();
        }
    }
}

說明:

1、這 indexer 特性你可以把它看成是另一種 property 的用法。

2、在呼叫有 indexer 成員時,你會有在使用陣列的錯覺。

3、一個 indexer 主體結構如下,通常會搭配 this keyword。

public int this[int index]    // Indexer declaration  
{  
    // get and set accessors  
}

4、一個 class 可以有多個 indexer,但需注意其 signature(回傳型別) 須不一樣。

5、其他範例

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Sports sports = new Sports();
            Console.WriteLine(sports[1]);

            Console.ReadKey();
        }
    }

    public class Sports
    {
        private string[] types = {
            "Baseball",
            "Basketball",
            "Football",
            "Hockey",
            "Soccer",
            "Tennis",
            "Volleyball"
        };

        public string this[int i]
        {
            get => types[i];
            set => types[i] = value;
        }
    }
}

 

參考資料:

Indexers (C# Programming Guide)