Dictionary.Item 和 Dictionary.Add 有啥区别?
Posted
技术标签:
【中文标题】Dictionary.Item 和 Dictionary.Add 有啥区别?【英文标题】:What is the difference between Dictionary.Item and Dictionary.Add?Dictionary.Item 和 Dictionary.Add 有什么区别? 【发布时间】:2017-01-31 06:40:25 【问题描述】:阅读C# Java HashMap equivalent的公认答案,它文学状态:
C# 的 Dictionary 使用 Item 属性来设置/获取项目:
myDictionary.Item[key] = value MyObject 值 = myDictionary.Item[key]
并且在尝试实现它时,使用时出现错误:
myDictionary.Item[SomeKey] = SomeValue;
错误:CS1061“字典”不包含 '项目'
我需要使用myDictionary.Add(SomeKey, SomeValue);
来代替this answer 和MSDN - Dictionary 来解决错误。
代码很好,但出于好奇,我做错了什么吗?除了一个不编译,还有什么区别
Dictionary.Item[SomeKey] = SomeValue;
和
Dictionary.Add(SomeKey, SomeValue);
编辑:
我在C# Java HashMap equivalent 中编辑了接受的答案。查看版本历史以了解原因。
【问题讨论】:
如果字典已经包含 SomeKey,后者会抛出 DuplicateKeyException,而前者不会。把它想象成 AddOrUpdate。 这第一个:Dictionary.Item[SomeKey] = SomeValue;是更改字典中已经存在的值。另一种是向字典中添加新项目。 至于你的错误,省略Item,像这样:myDictionary[SomeKey] = SomeValue; 实际语法是Dictionary[SomeKey] = SomeValue;
。您不使用 .Item
属性。
这不完全是一个错字,因为 indexer ([] msdn.microsoft.com/en-us/library/2549tw02.aspx
【参考方案1】:
我认为区别在于:
Dictionary[SomeKey] = SomeValue;
(不是Dictionary.Item[SomeKey] = SomeValue;
)如果键不存在会添加新的键值对,如果键存在则替换值
Dictionary.Add(SomeKey, SomeValue);
会添加新的键值对,如果键已经存在,则会抛出 Argument Exception: An item with the same key has been added
例子是:
try
IDictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(0, "a");
dict[0] = "b"; // update value to b for the first key
dict[1] = "c"; // add new key value pair
dict.Add(0, "d"); // throw Argument Exception
catch (Exception ex)
MessageBox.Show(ex.Message);
【讨论】:
【参考方案2】:区别很简单
Dictionary[SomeKey] = SomeValue; // if key exists already - update, otherwise add
Dictionary.Add(SomeKey, SomeValue); // if key exists already - throw exception, otherwise add
至于错误
Error: CS1061 'Dictionary' does not contain a definition for 'Item'
C# 允许“默认”索引器,但它应该如何在内部实现?请记住,有许多语言使用 CLR,而不仅仅是 C#,它们还需要一种调用该索引器的方法。
CLR 具有属性,并且它还允许在调用这些属性的 getter 或 setter 时提供参数,因为属性实际上被编译为一对 get_PropertyName() 和 set_PropertyName() 方法。因此,索引器可以由 getter 和 setter 接受附加参数的属性表示。
现在,没有名称就不可能有属性,因此我们需要为代表索引器的属性选择一个名称。默认情况下,“Item”属性用于索引器属性,但您可以使用IndexerNameAttribute 覆盖它。
现在,当索引器表示为常规命名属性时,任何 CLR 语言都可以使用 get_Item(index) 调用它。
这就是为什么在您链接的文章中,索引器被 Item 引用。虽然当你从 C# 中使用它时,你必须使用适当的语法并将其称为
Dictionary[SomeKey] = SomeValue;
【讨论】:
我刚刚发现了这个:Different ways of adding to Dictionary,我认为值得一提的是,尽管有错误,但可以知道两者之间的实际区别是什么。再次感谢你:)以上是关于Dictionary.Item 和 Dictionary.Add 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章