在一些遗留代码中,我看到了以下扩展方法,以方便添加新的键值项或更新值(如果键已经存在)。
方法 1(旧代码)。
public static void CreateNewOrUpdateExisting<TKey, TValue>( this IDictionary<TKey, TValue> map, TKey key, TValue value) { if (map.ContainsKey(key)) { map[key] = value; } else { map.Add(key, value); } }
不过,我已经检查过map[key]=value 它的工作完全相同。也就是说,这个方法可以用下面的方法2来代替。
map[key]=value
方法二。
public static void CreateNewOrUpdateExisting<TKey, TValue>( this IDictionary<TKey, TValue> map, TKey key, TValue value) { map[key] = value; }
现在,我的问题是.. 如果我用 Method-2 替换 Method-1 会有什么问题吗?它会在任何可能的情况下中断吗?
另外,我认为这曾经是 HashTable 和 Dictionary 之间的区别。HashTable 允许更新项目,或使用索引器添加新项目,而 Dictionary 不允许!在 C# > 3.0 版本中是否消除了这种差异?
该方法的目的是如果用户再次发送相同的键值,则不会抛出异常,该方法应该只使用新值更新条目,并且如果已经向该方法发送了新的键值对,则创建一个新条目.
如果我用 Method-2 替换 Method-1 会有什么问题吗?
不,只需使用map[key] = value. 这两个选项是等效的。
map[key] = value
关于Dictionary<>vs. Hashtable:当您启动 Reflector 时,您会看到两个类的索引器设置器都调用this.Insert(key, value, add: false);并且add参数负责在插入重复键时引发异常。所以这两个类的行为是相同的。
Dictionary<>
Hashtable
this.Insert(key, value, add: false);
add