把 C# 里不再使用的对象设为 NULL 的 3 个好处,你知道几个?

Coding-133

前言

嘿,各位程序员小伙伴们!

今天我们来聊一个有趣又略显争议的话题:在 C# 里,不再使用的对象要不要设置为 null?比如说:

Object obj = new Object();

// 处理业务逻辑
// ……

obj = null;

有人认为,这样做可以释放内存,优化程序性能;

也有人觉得,根本没必要这么做。

真相究竟如何呢?让我们一起深入探讨一番吧!

对象 = NULL 能够释放内存吗?

让我们先来揭开这个迷雾:答案是 不能

因为在 C# 中,垃圾回收器(GC)负责自动管理内存,确保不再使用的对象被回收。当一个对象不再被引用时,垃圾回收器会将其识别为 “垃圾”,并最终释放其占用的内存。

垃圾回收器通过周期性地扫描应用程序的堆(Heap)来识别不再使用的对象。

一旦确定某个对象不再被引用,它会被标记为 “垃圾”,并在适当的时机被回收。

所以,当你将对象设置为 null 时,实际上只是意味着这个对象的引用不再指向任何实际的对象实例,但之前占用的内存仍然在堆中,静静等待垃圾回收器的光顾。

对象 = NULL 有必要吗?

既然将对象设置为 null 并不能立即释放内存,那还有必要这样做吗?

答案是 有必要

虽然设置为 null 不能立刻释放对象,但显式地将对象设置为 null 可以帮助垃圾回收器更快地标记这些对象为不再被引用,减少对象的引用计数,从而加速垃圾回收过程。尤其是对于占用大量内存的对象,手动设置为 null 可以确保它们在不再需要时能够被及时回收。

这只是其中一个好处。

不知道你有没有想过一个问题,假设你有一个 Class A,里面有一个静态变量 aa。当 Class A 被 GC 回收时,静态变量 aa 会不会一起被释放?答案是 不会

因为静态变量一旦创建,它们就不会离开,就那样静静地待在内存里,垃圾回收器永远不会认为它们是垃圾。

在这种情况下,就需要将它们设置为 null,显式断开它们与内存实例的引用,从而避免静态变量越来越多,最终导致内存泄漏的风险。

这是第二个好处。

还有其他一些好处,比如设置一个不同使用的对象为 null 可以让代码更加清晰易懂。这样做可以明确告诉阅读代码的人(包括未来的你):“嘿,这个对象我不再用了。” 这就像给对象举行一个小小的告别仪式,让别人知道它的使命已经完成了。

警告:不要掉入 NULL 陷阱

看到这里,你是不是已经迫不及待想把所有不再使用的对象都设为 null 了?但我得给你泼点冷水:注意不要掉入 null 陷阱。

将对象设置为 null 有可能引发 NullReferenceException 异常,尤其是在多线程环境中。

想象一下,如果多个线程同时访问同一个对象,其中一个线程将对象设置为 null,那其他线程再访问它会发生什么?

NullReferenceException 异常可以说是程序开发中最顽固、最难排查的问题之一,以致于 .NET 团队专门为此在最新的 Visual Studio IDE 中增加提醒功能。

除此之外,如果你想通过判断对象是否为 null 来处理一些额外的需求,虽然这可能是个好主意,但是不得不说,这样做有可能会导致代码变得复杂,不必要的 null 检查也会让代码更加冗长,降低可读性。

总结

将不再使用的对象设置为 null 有其特定的用途和优势,但在大多数情况下,不设置为 null 也不会带来明显的负面影响。建议根据具体需求和场景来决定是否将对象设置为 null。比如说:

  • 对于占用大量内存的对象,或者在长期运行的程序中的对象如静态变量,建议将对象设置为 null 以加速内存回收。

  • 对于简单的数据结构或临时对象比如局部变量,不设置为 null 可能更为合适,因为这可以减少代码的复杂性。

如果你实在拿不准,不妨遵循这个简单的原则:全部都设置为 null 吧。毕竟,保持代码的整洁和清晰总是值得的。

好了,今天的分享就到这里啦,希望这篇文章能给你带来一些启发,让你在日常编码中做出更好的决策!如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
  2. C#12 中 5 个节省你开发时间的的改进
  3. C# 静态类,高手不想让你知道的 15 个真相
  4. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  5. 用 C# Stopwatch 计时,让代码性能飞起来!
  6. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  7. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  8. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  9. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  10. C# AutoMapper 10个常用方法总结
  11. C# 7个方法比较两个对象是否相等
  12. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号,更多干货等你来!