首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# 6.0的新字典初学者-澄清

C# 6.0的新字典初学者-澄清
EN

Stack Overflow用户
提问于 2015-01-21 20:21:19
回答 4查看 5.1K关注 0票数 19

我读过:

团队通常都在忙于实现初始化器上的其他变体。例如,您现在可以初始化Dictionary对象了

但从以下方面来看:

代码语言:javascript
复制
var Dic = new Dictionary<string,int>{ {"x",3}, {"y",7} };

代码语言:javascript
复制
var Dic = new Dictionary<string,int>{ ["x"]=3, ["y"]=7 };

我看不出好处在哪里。看上去一样。这两者只不过是一个名称-值集合。

他们用一对大括号换对方括号和一些逗号。

问题:

使用新语法的附加价值是什么?一个真实世界的例子将是非常感谢的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-21 20:37:42

字典的主要优点是一致性。使用字典时,初始化看起来与用法不一样。

例如,您可以:

代码语言:javascript
复制
var dict = new Dictionary<int,string>();
dict[3] = "foo";
dict[42] = "bar";

但是使用初始化语法时,您必须使用大括号:

代码语言:javascript
复制
var dict = new Dictionary<int,string>
{
    {3, "foo"},
    {42, "bar"}
};

新的C# 6索引初始化语法使初始化语法与索引使用更加一致:

代码语言:javascript
复制
var dict = new Dictionary<int,string>
{ 
    [3] = "foo",
    [42] = "bar"
};

但是,更大的优点是,这种语法还提供了允许初始化其他类型的好处。任何带有索引器的类型都将允许通过这种语法进行初始化,其中旧的集合初始化器只与实现IEnumerable<T>并具有Add方法的类型一起工作。这恰好适用于Dictionary<TKey,TValue>,但这并不意味着它适用于任何基于索引的类型。

票数 30
EN

Stack Overflow用户

发布于 2015-01-21 20:37:05

第一种情况下的代码使用集合初始化器语法。要能够使用集合初始化器语法,类必须:

集合初始化器

  1. 实现IEnumerable接口。
  2. 定义一个可访问的Add()方法。(截至C#6/as 2015,它可能是一种扩展方法)

因此,这样定义的类可以使用以下语法:

代码语言:javascript
复制
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()方法,只需要索引器。

能够在单个表达式中完全初始化对象通常是有用的(在某些情况下,这是一个需求)。字典初始化器语法使得在不需要使用集合初始化器的情况下更容易做到这一点。

票数 9
EN

Stack Overflow用户

发布于 2016-02-28 18:54:49

这可能是一个值得怀疑的特性,但是新的语法允许您多次设置相同的属性。

代码语言:javascript
复制
        private static Dictionary<string, string> test1
        = new Dictionary<string, string>() {
            ["a"] = "b",
            ["a"] = "c"
        };

允许:在这里,键"a"的值为"c"

相反,使用

代码语言:javascript
复制
private static Dictionary<string, string> test2
    = new Dictionary<string, string>() {
        { "a","b" },
        { "a","c" },
    };

创建一个异常:

代码语言:javascript
复制
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)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28076127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档