为什么.NET Dictionary <TKey,TValue>是不可变的?

smw*_*dia 9 .net c#

我声明了一个Dictionary类型对象,并尝试在其中添加一些项目.但我甚至不能修改项目的价值.密钥不应该是可修改的,但为什么不是值?谢谢.

    Dictionary<string, string> dict = new Dictionary<string, string>();
    dict.Add("1", "bob");
    dict.Add("2", "jack");
    dict.Add("3", "wtf");
    foreach (string key in dict.Keys)
    {
        dict[key] = "changed"; //System.InvalidOperationException: Collection was modified
    }
Run Code Online (Sandbox Code Playgroud)

Fem*_*ref 17

您不能修改您在循环中迭代的集合foreach.这与字典无关 - dict[key] = "value";foreach循环外完美地工作.


Pet*_*sen 14

字典本身并不是一成不变的.但是在foreach循环中枚举它时你无法更改字典.

这里有一个进一步阅读的链接:为什么C#foreach语句中的迭代变量是只读的?

  • 换句话说,当前迭代的集合是不可变的 (2认同)
  • @abatishchev,不应修改的对象与无法修改的对象之间存在差异.术语_immutable_指的是后者,而正在迭代的集合是前者. (2认同)

her*_*ter 7

你使用的术语是不可变的错误.它通常用于内部状态初始化后不会改变的对象.这Dictionary<TKey, TValue>是可变的.当有人试图在枚举期间修改异常时,它会抛出异常,这是一种明确实现的行为.

您可能会混淆为什么只更改值时枚举会发生变化.其他答案尚未涵盖这一点.

那么,当你这样做的时候

dict[key] = "something";
Run Code Online (Sandbox Code Playgroud)

枚举改变,如果该键不存在,因为它会在这种情况下被添加,导致枚举改变.当然,如果密钥已经存在,字典实现可以首先检查并允许修改,但我想它遵循早期失败的原则,经常失败以改善应用程序的整体完整性.