登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
C#会重蹈覆辙吗?系列之4:华而不实的C#析构器 ...
C#会重蹈覆辙吗?系列之4:华而不实的C#析构器
[ 复制链接 ]
仰翡邸
2025-5-29 19:28:45
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
前段时间去鸟国出差,颠倒黑白,碌碌无为,疏于写博,请大家理解。下面继续前贴7月《C与C++社区混战,C#会重蹈覆辙吗?》的讨论。这次要谈的是C#的析构器的问题。这是C#中非常华而不实的一个设计,不必要,且常常误导很多C#er,且是.NET性能问题的常见陷阱地带。下面逐项讨论:
1.C#析构器是一个丑陋的语法糖
C#析构器(即Destructor)本质上是对Finalize方法的一个override。既然是对Finalize方法的override,那就大大方方让程序员去override 根类Object的Finalize方法好了。可是,C#设计师们首先搞了一个析构器,接着又在编译器里面把父类的Finalize方法隐藏掉(你去override的时候,告诉你父类没有Finalize方法)。但是编译完后,在IL代码中又告诉你override了父类中的Finalize方法,而你写的析构器却不翼而飞!
我在编程语言历史上看到很多语法糖,有些语法糖华丽,有些语法糖冗赘。但是还从没见过如此弯弯绕的语法糖!
2. C#析构器偏离了析构器原有的意思
析构器自在各编程语言中造始,便有以下两大基本含义:
(a) 回收对象内部开销的动态内存以及各种资源
(b) 回收具有确定性时刻,比如delete对象时,或者栈cleanup时。
可是C#将Finalize强扭成析构器后,彻底丢失掉前面两大基本含义,既无法回收动态内存,又无法确定时刻调用(只能等GC在猴年马月想起来才调用)。而只用于回收资源(而即便连这个任务也完成得很差,参见3.C#析构器不能完成其设计的初衷)。这使得很多沿用以前析构器概念的程序员经常犯如下错误,比如:
class MyClass {
object field;
~MyClass() { field=null; } //既不必要,也严重损伤性能
}
class MyClass {
object field;
~MyClass() { GC.Collect(); } //既不必要,也严重、严重损伤性能
}
3. C#析构器不能完成其设计的初衷
前面说过C#析构器主要用于释放对象的资源(非托管资源),而非内存。
但很不幸,对于C#析构器这个唯一的任务,它却不能很好地胜任。因为C#析构器(也就是Finalize方法)是由GC调用的,而GC只会在猴年马月想起来才调用(回收对象之前的一轮回收),往往延误了对象资源的释放——而对象资源是非常昂贵的。 如果真的这样来做的话,项目会倒大霉——比如我们以前的一个项目,有部分程序员在析构器中释放一些native内存,最后导致内存暴涨——用户抱怨下来,最后一调试发现原来都是在析构器惹得祸——这些析构器半天没有被GC调用!
实际上,C#设计者在后来意识到这个问题了,于是又推出来一个Dispose方法(即Dispose模式)来让用户显式释放资源。然后又推荐程序员在Dispose里面GC.SuppressFinalize(). 即屏蔽析构器。
既然Dispose能将事情(确定性地释放非托管资源)做好,析构器如此没用,当初设计它干吗?这是再典型不过的多余设计了!
4. C#析构器会带来严重的性能障碍
a) C#析构器会将对象的代标记(Generation)拖大,使得对象更难以被GC回收,给GC造成更大性能负担。
b) 析构器本身释放资源较晚,造成资源紧张,影响系统性能。
c) 析构器执行需要一个单独的线程开销,该线程的执行(必须时间很短)需要其他线程停止,也是一个性能负担。
这也是为什么C#推荐实现Dispose,不推荐实现析构器的原因。因为析构器的性能代价太大。可能中小项目的开发人员感受不到这一点,但我相信做过大型项目的朋友,对C#析构器的性能问题会有非常深的体会。
综上,C#析构器是C#设计师们纯粹为了炫耀自己华丽语法糖、而不小心又失了手艺、一个拙劣的设计。
[ Update: ]
听从网友的建议,把文章中“脑抽型、臭脚、sucks”等“骂街”的话删除掉了。写这些“骂街”的话实在是昨晚文章写到深处,肝火旺盛,想到某些言论,情不自禁而已。并非我就是“泼妇”,今天一看自己昨晚的言论确实火力太猛,接受大家的意见,改正语言风格,希望下面坚持“技术讨论不骂街“的原则。如果我有时候情不自禁做不到,希望大家监督指点,我会及时改过自新,重新做人
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
重蹈覆辙
系列
华而不实
析构
相关帖子
【系列开篇】从零构建智能字幕校准系统:一个AI+微服务的完整实战之旅
DotMemory系列:2. 事件泄露引发的内存暴涨分析
C#AI系列(2):深度学习项目构建及实战TorchSharp准备篇
[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅
解密Prompt系列65. 三巨头关于大模型内景的硬核论文
C#AI系列(5): 从零开始 C# 轻松语音识别
langchain4j 学习系列(7)-文本分类
云电脑系列18:旧电脑别扔:连云电脑,老旧设备也能拥有高性能
C#AI系列(5): C#离线实现高效OCR
解密Prompt系列66. 视觉Token爆炸→DeepSeek-OCR光学压缩
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
【系列开篇】从零构建智能字幕校准系统:一个AI+微服务的完整实战之旅
3
852
任娅翠
2025-11-07
业界
DotMemory系列:2. 事件泄露引发的内存暴涨分析
2
829
东门芳洲
2025-11-15
业界
C#AI系列(2):深度学习项目构建及实战TorchSharp准备篇
1
572
遗憩
2025-11-21
业界
[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅
4
241
方方仪
2025-11-27
业界
解密Prompt系列65. 三巨头关于大模型内景的硬核论文
1
759
轮达
2025-12-01
业界
C#AI系列(5): 从零开始 C# 轻松语音识别
0
107
梦霉
2025-12-07
安全
langchain4j 学习系列(7)-文本分类
0
742
胥望雅
2025-12-09
安全
云电脑系列18:旧电脑别扔:连云电脑,老旧设备也能拥有高性能
0
298
虾氲叱
2025-12-10
业界
C#AI系列(5): C#离线实现高效OCR
0
683
郏琼芳
2025-12-13
业界
解密Prompt系列66. 视觉Token爆炸→DeepSeek-OCR光学压缩
0
418
筒霓暄
2025-12-15
回复
(5)
频鹏凶
2025-10-25 04:12:53
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
收藏一下 不知道什么时候能用到
裒噎
2025-11-5 15:38:08
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
劳暄美
2025-11-29 00:32:19
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
前排留名,哈哈哈
喜及眩
2025-12-7 15:39:41
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
很好很强大 我过来先占个楼 待编辑
聱嘹
3 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
分享、互助 让互联网精神温暖你我
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
代码
安全
签约作者
程序园优秀签约作者
发帖
仰翡邸
3 天前
关注
0
粉丝关注
20
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845357
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
157
【译】初探 Visual Studio 2026 全新的用户
315
建筑渗漏治理的标准化实践:基于上海芮生建
48
Aspire 13:从.NET 编排工具到真正的多语言
997
用 .NET 最小化 API 构建高性能 API
394
VonaJS是如何做到文件级别精确HMR(热更新)
386
PHP 值对象实战指南:避免原始类型偏执
98
北京上门收酒机构排行|3家靠谱之选,卖酒
921
好拼|免费在线拼图工具又收到赞助啦
479
数据点的“社交距离”:衡量它们之间的相似
718
告别“草率编程”:Vibe Engineering 如何
10
字符串匹配算法
342
监听小工具-股票监控神奇九转分钟线信号触
427
国内GEO优化技术深度测评:核心维度全景对
366
Avalonia源码解读:Grid(网格控件)
239
研究 TikTok 爆款的人,一定要懂这类下载工
960
Java Optional 完全指南:优雅处理 null 的
26
全面封禁 Cursor!又一家大厂出手了
883
记一次MySQL binlog日志导致磁盘空间占满的
783
记一次MySQL binlog日志导致磁盘空间占满的
880
小白也能看懂的RLHF-PPO:原理篇