索引初始化程序
索引初始化程序可以同时创建和初始化带索引的对象。
这使得初始化词典非常容易:
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.