关于c#:Dictionary.Item和Dictionary.Add有什么区别?

What is the difference between Dictionary.Item and Dictionary.Add?

阅读C.JavaJasHeMAP等价的公认答案,即文学状态:

C#'s Dictionary uses the Item property for setting/getting items:

  • myDictionary.Item[key] = value
  • MyObject value = myDictionary.Item[key]

当尝试实现它时,我在使用时会得到一个错误:

myDictionary.Item[SomeKey] = SomeValue;

Error: CS1061 'Dictionary' does not contain a definition for
'Item'

为了解决这个错误,我需要使用一个myDictionary.Add(SomeKey, SomeValue);来代替这个答案和msdn-字典。

代码很好,但出于好奇,我做错什么了吗?除了一个没有编译,两者之间的区别是什么

1
Dictionary.Item[SomeKey] = SomeValue;

1
Dictionary.Add(SomeKey, SomeValue);

编辑:

我在C.J.JavaHasMead中编辑了所接受的答案。请参阅版本历史以了解原因。


我认为区别在于:

  • 如果密钥不存在,Dictionary[SomeKey] = SomeValue;(不是Dictionary.Item[SomeKey] = SomeValue;)将添加新的密钥值对,如果密钥存在,它将替换该值。
  • Dictionary.Add(SomeKey, SomeValue);将添加新的键值对,如果该键已经存在,则会引发参数异常:已经添加了具有相同键的项

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
 }

区别很简单

1
2
Dictionary[SomeKey] = SomeValue; // if key exists already - update, otherwise add
Dictionary.Add(SomeKey, SomeValue); // if key exists already - throw exception, otherwise add

至于错误

1
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)来调用它。

这就是为什么在您链接的文章中,索引器被项引用的原因。但是,当您从C使用它时,您必须使用适当的语法并将其称为

1
Dictionary[SomeKey] = SomeValue;