索引初始化程式

索引初始化程式可以同時建立和初始化帶索引的物件。

這使得初始化詞典非常容易:

var dict = new Dictionary<string, int>()
{
    ["foo"] = 34,
    ["bar"] = 42
};

具有索引的 getter 或 setter 的任何物件都可以使用以下語法:

class Program
{
    public class MyClassWithIndexer
    {
        public int this[string index]
        {
            set
            {
                Console.WriteLine($"Index: {index}, value: {value}");
            }
        }
    }

    public static void Main()
    {
        var x = new MyClassWithIndexer()
        {
            ["foo"] = 34,
            ["bar"] = 42
        };

        Console.ReadKey();
    }
}

輸出:

索引:foo,值:34
索引:bar,值:42

檢視演示

如果該類有多個索引器,則可以將它們全部分配到一組語句中:

class Program
{
    public class MyClassWithIndexer
    {
        public int this[string index]
        {
            set
            {
                Console.WriteLine($"Index: {index}, value: {value}");
            }
        }
        public string this[int index]
        {
            set
            {
                Console.WriteLine($"Index: {index}, value: {value}");
            }
        }
    }

    public static void Main()
    {
        var x = new MyClassWithIndexer()
        {
            ["foo"] = 34,
            ["bar"] = 42,
            [10] = "Ten",
            [42] = "Meaning of life"
        };
    }
}

輸出:

指數:foo,價值:34
指數:柱,價值:42
指數:10,價值:十
指數:42,價值:生命的意義

應該注意的是,與 Add 方法(在集合初始化器中使用)相比,索引器 set 訪問器可能表現不同。

例如:

var d = new Dictionary<string, int>
{
    ["foo"] = 34,
    ["foo"] = 42,
}; // does not throw, second value overwrites the first one

與:

var d = new Dictionary<string, int>
{
    { "foo", 34 },
    { "foo", 42 },
}; // run-time ArgumentException: An item with the same key has already been added.