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]
号
当尝试实现它时,我在使用时会得到一个错误:
Error: CS1061 'Dictionary' does not contain a definition for
'Item'
号
为了解决这个错误,我需要使用一个
代码很好,但出于好奇,我做错什么了吗?除了一个没有编译,两者之间的区别是什么
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; |
。