Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dictionary.Item和Dictionary.Add之间有什么区别?_C#_Dictionary - Fatal编程技术网

C# Dictionary.Item和Dictionary.Add之间有什么区别?

C# Dictionary.Item和Dictionary.Add之间有什么区别?,c#,dictionary,C#,Dictionary,在阅读被接受的答案时,它指出: C#的字典使用Item属性设置/获取项: myDictionary.Item[键]=值 MyObject值=myDictionary.Item[键] 在尝试实施时,我在使用以下命令时出错: myDictionary.Item[SomeKey]=SomeValue 错误:CS1061“Dictionary”不包含的定义 “项目” 我需要使用myDictionary.Add(SomeKey,SomeValue)与和相同,以解决错误 代码很好,但出于好奇,我是否做错

在阅读被接受的答案时,它指出:

C#的字典使用Item属性设置/获取项:

  • myDictionary.Item[键]=值
  • MyObject值=myDictionary.Item[键]
在尝试实施时,我在使用以下命令时出错:

myDictionary.Item[SomeKey]=SomeValue

错误:CS1061“Dictionary”不包含的定义 “项目”

我需要使用
myDictionary.Add(SomeKey,SomeValue)与和相同,以解决错误

代码很好,但出于好奇,我是否做错了什么?除了一个不编译之外,它们之间的区别是什么

Dictionary.Item[SomeKey] = SomeValue; 

编辑:


我在中编辑了被接受的答案。查看版本历史了解原因。

我认为区别在于:

  • Dictionary[SomeKey]=SomeValue
    (不是
    字典。项[SomeKey]=SomeValue;
    )将添加新的键值对,如果该键不存在,则将替换该值
  • Dictionary.Add(SomeKey,SomeValue)
    将添加新的键值对,如果该键已经存在,它将抛出参数异常:已添加具有相同键的项
例如:

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);
 }
试试看
{
IDictionary dict=新字典();
添加(0,“a”);
dict[0]=“b”;//将第一个键的值更新为b
dict[1]=“c”;//添加新的键值对
dict.Add(0,“d”);//抛出参数异常
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
区别很简单

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\u PropertyName()和set\u PropertyName()方法编译的。所以,索引器可以由getter和setter接受附加参数的属性表示

现在,不能没有名称的属性,所以我们需要为表示索引器的属性选择一个名称。默认情况下,“Item”属性用于索引器属性,但您可以使用覆盖它

现在,当索引器表示为常规命名属性时,任何CLR语言都可以使用get_项(index)调用它

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

Dictionary[SomeKey] = SomeValue;

如果字典已经包含SomeKey,则后者将抛出DuplicateKeyException,而前者不会。把它想象成AddOrUpdate。第一个:Dictionary.Item[SomeKey]=SomeValue;是更改字典中已有的值。另一个是向字典中添加新项,对于您的错误,只需省略项,如下所示:myDictionary[SomeKey]=SomeValue;实际语法是
Dictionary[SomeKey]=SomeValue。您没有使用
.Item
属性。这不完全是一个打字错误,因为indexer([]我刚刚发现了这个:我认为这是值得一提的,因为我知道这两者之间的实际区别,尽管有错误。再次感谢:)
Dictionary[SomeKey] = SomeValue;