.NET 4.8/C#7.3:字典值为值元组时能否修改及修改方法
问题解答
1. 值元组作为Dictionary的TValue,是不是初始化后就无法修改?
不是不能修改字典里的元组值,而是不能直接修改索引器返回的元组副本的字段。因为值元组是值类型,test["c"]返回的是字典中对应值的副本,不是原数据的引用。如果允许修改这个副本的字段,修改的只是临时对象,原字典里的元组不会有任何变化,所以编译器直接禁止了这种无意义的操作,抛出CS1612错误。
2. 如何修改字典中值元组的字段?
有两种常见方案:
方案一:取出元组修改后重新赋值
先获取当前元组的副本,修改需要的字段,再把新的元组赋值回字典:
// 获取当前元组 var tuple = test["c"]; // 修改Item1,保留原Item2的值 test["c"] = (3, tuple.Item2);
如果使用命名值元组(比如(int Id, string Name)),代码会更易读;若使用C# 9.0及以上版本,还可以用with表达式简化:
var tuple = test["c"]; test["c"] = tuple with { Id = 3 };
注:.NET 4.8默认对应C# 7.3,with表达式需要升级项目的语言版本才能使用。
方案二:改用引用类型替代值元组
如果需要频繁修改元组内的字段,可以自定义一个类(引用类型)来代替值元组,这样修改类的属性时会直接作用于字典中的实例:
public class MyData { public int Num { get; set; } public string Str { get; set; } } // 使用Dictionary<string, MyData> var test = new Dictionary<string, MyData> { { "a", new MyData { Num = 0, Str = "A" } }, { "b", new MyData { Num = 1, Str = "B" } }, { "c", new MyData { Num = 2, Str = "C" } } }; // 直接修改属性 test["c"].Num = 3;
内容的提问来源于stack exchange,提问作者Jyunhao Shih
相关产品推荐
相关产品推荐

