最近有很多关于C#6.0的新内容的讨论
最受关注的功能之一是在C#6.0中使用Dictionary
初始化器
但是等一下我们一直在使用集合初始化器来初始化集合,并且可以在.NET 4.0和.NET 4.5(不知道旧版本)中初始化Dictionary
,如
Dictionary<int, string> myDict = new Dictionary<int, string>() {
{ 1,"Pankaj"},
{ 2,"Pankaj"},
{ 3,"Pankaj"}
};
那么C#6.0中有什么新东西,他们在C#6.0中讨论的是什么字典初始化器
答案 0 :(得分:74)
虽然可以使用集合初始化程序初始化字典,但这非常麻烦。特别是对于那些应该是语法糖的东西。
字典初始化器更清晰:
var myDict = new Dictionary<int, string>
{
[1] = "Pankaj",
[2] = "Pankaj",
[3] = "Pankaj"
};
更重要的是,这些初始化程序不仅适用于词典,它们可用于支持索引器的任何对象,例如List<T>
:
var array = new[] { 1, 2, 3 };
var list = new List<int>(array) { [1] = 5 };
foreach (var item in list)
{
Console.WriteLine(item);
}
输出:
1
5
3
答案 1 :(得分:2)
仅强调最重要的区别,字典初始化器调用索引器,因此当遇到重复键时它执行更新,而集合初始化器调用将抛出的Tools.DiffFiles "FirstFile.cs" "SecondFile.cs"
方法。
简要概述一般差异:
集合初始值设定项调用Add
方法(对于IEnumerables),其中作为字典初始值设定项调用索引器。这具有字典的添加与更新语义差异。
字典初始化程序在技术上是对象初始化程序,因此可以与初始化其他属性混合使用。例如:
Add
但不是
new Dictionary<int, string>
{
[1] = "Pankaj",
[2] = "Pankaj",
[3] = "Pankaj",
Capacity = 100,
};
仅是对象初始化程序,索引初始化程序可用于带有索引器的任何类,而集合初始化程序仅可用于IEnumerables,无论如何应该很明显。
可以使用自定义new Dictionary<int, string>()
{
{ 1,"Pankaj" },
{ 2,"Pankaj" },
{ 3,"Pankaj" },
Capacity = 100, // wont compile
};
扩展方法来增强集合初始化程序,而不能使用字典初始化程序(C#中尚无扩展索引器)。
字典初始化程序在初始化字典时可能在主观上更具可读性:)
词典初始值设定项是C#6.0功能,而集合初始值设定项可从C#3.0开始使用。
答案 2 :(得分:0)
New以这种方式创建字典
Dictionary<int, string> myDict = new Dictionary<int, string>() {
[1] = "Pankaj",
[2] = "Pankaj",
[3] = "Pankaj"
};
的风格为<index> = <value>
已过时:字符串索引成员语法(如评论中所述)
Dictionary<int, string> myDict = new Dictionary<int, string>() {
$1 = "Pankaj",
$2 = "Pankaj",
$3 = "Pankaj"
};
要理解$运算符,请查看AreEqual函数调用。注意在builtInDataTypes变量上调用“$ Boolean”的Dictionary成员 - 即使Dictionary上没有“Boolean”成员。这样的显式成员不是必需的,因为$运算符调用字典上的索引成员,相当于调用buildInDataTypes [“Boolean”]。