C#中Dictionary.TryGetValue未获取对象引用反而创建实例问题求助
解决Dictionary中修改Cell对象内容不同步的问题
嘿,刚接触C#遇到这种“明明拿到了对象修改却没生效”的问题太正常了,我来帮你拆解一下核心原因和解决办法~
首先得搞清楚C#里**值类型(struct)和引用类型(class)**的区别,这是你遇到问题的关键:
最常见的原因:Cell是值类型(struct)
如果你的Cell定义是struct而不是class,那用TryGetValue获取到的其实是原对象的副本——你修改这个副本的内容,完全不会影响字典里存储的原始对象。
解决办法:
- 优先把
Cell改成class(引用类型):这样TryGetValue拿到的是对象的引用,修改引用指向的对象属性时,字典里的原始对象会同步变化。 - 如果必须用
struct:修改完副本后,一定要把它重新放回字典里,覆盖原来的值。
第二种可能:不小心重新赋值了引用对象
如果Cell已经是class了,但你在修改时做了类似cell = new Cell();的操作——这时候你把cell变量指向了一个新的对象,后续修改的都是这个新对象,和字典里的原始对象完全没关系了。
错误示例:
if (cellDict.TryGetValue("A1", out var cell)) { cell = new Cell(); // 这里cell指向了新对象,和字典里的引用断开了 cell.Content = "新内容"; }
正确示例:
if (cellDict.TryGetValue("A1", out var cell)) { cell.Content = "新内容"; // 直接修改原引用对象的属性,字典里的内容会同步更新 }
完整代码示例
引用类型(class)版本(推荐)
public class Cell { public string Content { get; set; } } // 使用字典 var cellDictionary = new Dictionary<string, Cell>(); // 添加单元格 cellDictionary.Add("A1", new Cell { Content = "初始内容" }); // 修改单元格 if (cellDictionary.TryGetValue("A1", out var targetCell)) { targetCell.Content = "修改后的内容"; } // 验证结果 Console.WriteLine(cellDictionary["A1"].Content); // 输出:修改后的内容
值类型(struct)版本(需手动放回字典)
public struct Cell { public string Content { get; set; } } // 使用字典 var cellDictionary = new Dictionary<string, Cell>(); // 添加单元格 cellDictionary.Add("A1", new Cell { Content = "初始内容" }); // 修改单元格 if (cellDictionary.TryGetValue("A1", out var targetCell)) { targetCell.Content = "修改后的内容"; cellDictionary["A1"] = targetCell; // 必须把修改后的副本放回字典 } // 验证结果 Console.WriteLine(cellDictionary["A1"].Content); // 输出:修改后的内容
你可以先检查一下自己的Cell是struct还是class,再看看有没有不小心重新赋值对象的情况,应该就能解决问题啦~
内容的提问来源于stack exchange,提问作者crapolantern
相关产品推荐
相关产品推荐

