我读过:
团队通常都在忙于实现初始化器上的其他变体。例如,您现在可以初始化Dictionary对象了
但从以下方面来看:
var Dic = new Dictionary<string,int>{ {"x",3}, {"y",7} };与
var Dic = new Dictionary<string,int>{ ["x"]=3, ["y"]=7 };我看不出好处在哪里。看上去一样。这两者只不过是一个名称-值集合。
他们用一对大括号换对方括号和一些逗号。
问题:
使用新语法的附加价值是什么?一个真实世界的例子将是非常感谢的。
发布于 2015-01-21 20:37:42
字典的主要优点是一致性。使用字典时,初始化看起来与用法不一样。
例如,您可以:
var dict = new Dictionary<int,string>();
dict[3] = "foo";
dict[42] = "bar";但是使用初始化语法时,您必须使用大括号:
var dict = new Dictionary<int,string>
{
{3, "foo"},
{42, "bar"}
};新的C# 6索引初始化语法使初始化语法与索引使用更加一致:
var dict = new Dictionary<int,string>
{
[3] = "foo",
[42] = "bar"
};但是,更大的优点是,这种语法还提供了允许初始化其他类型的好处。任何带有索引器的类型都将允许通过这种语法进行初始化,其中旧的集合初始化器只与实现IEnumerable<T>并具有Add方法的类型一起工作。这恰好适用于Dictionary<TKey,TValue>,但这并不意味着它适用于任何基于索引的类型。
发布于 2015-01-21 20:37:05
第一种情况下的代码使用集合初始化器语法。要能够使用集合初始化器语法,类必须:
IEnumerable接口。Add()方法。(截至C#6/as 2015,它可能是一种扩展方法)因此,这样定义的类可以使用以下语法:
public class CollectionInitializable : IEnumerable
{
public void Add(int value) { ... }
public void Add(string key, int value) { ... }
public IEnumerator GetEnumerator() { ... }
}
var obj = new CollectionInitializable
{
1,
{ "two", 3 },
};并非所有对象都是IEnumerable或具有add方法,因此不能使用该语法。
另一方面,许多对象定义(可设置)索引器。这是使用直接初始化器的地方。有索引器可能是有意义的,但不一定是IEnumerable。使用字典初始化器,您不需要是IEnumerable,不需要Add()方法,只需要索引器。
能够在单个表达式中完全初始化对象通常是有用的(在某些情况下,这是一个需求)。字典初始化器语法使得在不需要使用集合初始化器的情况下更容易做到这一点。
发布于 2016-02-28 18:54:49
这可能是一个值得怀疑的特性,但是新的语法允许您多次设置相同的属性。
private static Dictionary<string, string> test1
= new Dictionary<string, string>() {
["a"] = "b",
["a"] = "c"
};允许:在这里,键"a"的值为"c"。
相反,使用
private static Dictionary<string, string> test2
= new Dictionary<string, string>() {
{ "a","b" },
{ "a","c" },
};创建一个异常:
Unbehandelte Ausnahme: System.TypeInitializationException: Der Typeninitialisierer für "ConsoleApplication1.Program" hat eine Ausnahme verursacht.
---> System.ArgumentException: Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
bei System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
bei System.Collections.Generic.Dictionary``2.Insert(TKey key, TValue value, Boolean add)
bei System.Collections.Generic.Dictionary``2.Add(TKey key, TValue value)
bei ConsoleApplication1.Program..cctor() in Program.cs:Zeile 19.
--- Ende der internen Ausnahmestapelüberwachung ---
bei ConsoleApplication1.Program.Main(String[] args)https://stackoverflow.com/questions/28076127
复制相似问题