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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

标准库:collections之orderedDict

VisualVM 和 GlassFish

结合数组和字典属性的数据类型

Python中os和sys模块

Python学习笔记--系统相关模块和操作

如何正确注释类实例