C#中Lambda捕获场景下hugeString的垃圾回收问题及优化疑问
问题解答
1. TestClass实例化后,hugeString会被GC回收吗?
会的。核心原因是代码中的lambda表达式() => length捕获的是值类型变量length,而非hugeString本身:
length是hugeString.Length的拷贝(int是值类型),赋值完成后就和hugeString没有任何引用关联。- 构造函数执行完毕后,局部变量
hugeString的作用域结束,没有任何存活的引用指向它,GC会将其标记为可回收对象。
2. 取消注释hugeString = null对垃圾回收有帮助吗?
完全没有帮助。
- 局部变量在方法(构造函数)执行完成后,本身就会脱离作用域,CLR的垃圾回收器能自动识别该变量不再被引用,不需要手动置null。
- 手动赋值
null属于冗余操作,JIT编译器甚至可能直接优化掉这行代码,不会对GC的回收时机或效率产生任何影响。
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

