发布于2026-07-20 阅读(0)
扫一扫,手机访问
DictionaryAdd 方法会直接抛出 ArgumentException,更别提如果初始化后忘了检查 ContainsKey 或者没走 TryGetValue,运行时大概率会直接崩掉。这些都不是小问题,而是日常开发中最容易翻车的地方。
Add 会报“给定键已经属于字典”?这是最常见的误用:把 Add 当成“有就更新,无就新增”,但它的语义其实只有后者。一旦 Key 已经存在,它会毫不留情地抛出异常。那么正确的做法是什么?
dict[key] = value 赋值,这种方式会自动覆盖已有值。if (dict.ContainsKey(key)) dict[key] = value;。dict.TryAdd(key, value)(.NET 5+ 引入),只在 Key 不存在时写入,不会抛异常。dict.Add("name", "Alice"); dict.Add("name", "Bob"); —— 第二行必然崩溃。TryGetValue 比 ContainsKey + 索引器 快在哪里?这背后是个典型的性能优化点:两次哈希查找变成一次。用 ContainsKey 判断后再通过 dict[key] 取值,底层其实是两次哈希定位;而 TryGetValue 一次到位,同时返回是否存在和对应的值,效率更高,也更适合在多线程场景下配合使用。
if (dict.TryGetValue("id123", out string name))
{
Console.WriteLine(name);
}
if (dict.ContainsKey("id123"))
{
Console.WriteLine(dict["id123"]); // 多一次哈希计算
}
out 参数的类型必须和 TValue 严格匹配,比如 int? 和 int 不能混用。默认情况下,自定义类作为 Key 会按引用比较,两个内容相同但不同实例的对象会被视为不同的 Key —— 这通常不是你期望的行为。解决方案其实很明确:
GetHashCode() 和 Equals(object obj),并且两者的逻辑要一致,例如都基于 Id 字段。IEquatable,再配合 GetHashCode 的重写。record(C# 9+),它自动生成相等性成员,天生适合作为 Key:
public record Person(string Name, int Age); var dict = new Dictionary(); dict[new Person("Tom", 25)] = "Engineer";
TryGetValue 会找不到该 Key —— 也就是“查无此键”。说到底,真正棘手的问题不是“怎么初始化一个 Dictionary”,而是并发场景下的静默错误、Key 生命周期管理容易被忽略、以及深嵌套结构中复用同一个字典实例导致的数据污染。这些问题不会在编译时报错,但一旦进入调试阶段,往往会让排查时间翻倍。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8