C#中Dictionary的引用机制是怎样的?为何赋值未生成副本?
问题解答
对,变量b获取的确实是a的引用,而非副本。
在C#中,Dictionary<TKey, TValue>属于引用类型,这类类型的变量本身并不存储对象的实际数据,而是存储对象在托管堆中的内存地址。当执行var b = a;这行代码时,只是把a中保存的内存地址复制给了b,此时a和b指向的是同一个Dictionary实例。
所以后续通过b调用Add方法添加元素,本质上是在操作同一个字典对象,a.Count和b.Count自然会同步变化,最终输出的三个3也验证了这一点——不管是通过a、b还是cnt属性读取,都是同一个字典的元素数量。
测试代码
public class Test{ public Dictionary<int, int> a = new Dictionary<int, int>(); public int cnt => a.Count; public void Fn() { var b = a; b.Add(1, 2); b.Add(2, 2); b.Add(3, 2); Console.WriteLine(a.Count); Console.WriteLine(b.Count); } } public class Program{ public static void Main() { Test test=new Test(); test.Fn(); Console.WriteLine(test.cnt); } }
内容的提问来源于stack exchange,提问作者Game_dev
相关产品推荐
相关产品推荐

