惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
F
Fortinet All Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
月光博客
月光博客
L
LangChain Blog
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
Y
Y Combinator Blog
雷峰网
雷峰网

博客园 - WmW

C#学习牛顿迭代法开方 mysql将一个表中指定时间之后的新数据导入到另一个表中 使用具体时间和DateTime.Now运算时需要注意DateTime.Now的毫秒数 简单搭建一个 ASP.NET Core Web API + Mysql + SqlSugar demo项目 C# 学习研究CRC校验 C# 学习逆变和协变 C# 返回Task或者Task<T>的方法中如果没有异步方法,就没必要使用async修饰 关于字节序的概念加深 C# 基于ReadOnlySequence和ReadOnlySequenceSegment的简单封装 简单接触BCD码,以及使用C#简单实现BCD转换 C# ReadOnlySequence和ReadOnlySequenceSegment简单使用 C# 非常简单的文字转语音实现 C# 输出年龄和属相列表 C# 封装了一个用来对参数值进行范围限制的泛型方法 C# 为WindowsDefender防火墙已经存在的入站规则添加IP地址 C# 将Framework4.8控制台程序注册为windows服务 C# async void 方法中使用await时外部不会等待 C# Channel学习 C# 使用字符串分割字符串 C# 一个简单的连续心率血氧压缩算法 C# 将日期时间按照ISO 8601标准转成字符串 Dapper传递参数对象时,只支持属性,无法解析字段(出现Parameter '?id' must be defined)
C# 标准的Dispose模式
WmW · 2025-06-27 · via 博客园 - WmW
    /// <summary>
    /// Dispose模式示例
    /// </summary>
    public class Example : IDisposable {
        /// <summary>
        /// 标记资源是否已释放
        /// </summary>
        private bool disposed = false;

        /// <summary>
        /// 析构函数(终结器)
        /// 由垃圾回收器在对象被回收前调用,仅用于释放非托管资源,因为此时托管资源可能已被GC回收,
        /// 即使用户手动调用Dispose也可能存在当前对象被其他地方引用导致不能正常释放的情况,更何况还有可能干脆就忘记手动调用了,为了安全起见,因此要在析构函数中调用Dispose(bool disposing)做最后的保障
        /// </summary>
        ~Example() {
            // 仅释放非托管资源
            Dispose(false);
        }

        /// <summary>
        /// 实现IDisposable接口的显式释放方法
        /// 供用户代码主动调用释放资源
        /// </summary>
        public void Dispose() {
            // 释放托管和非托管资源
            Dispose(true);

            // 阻止GC调用终结器,因为资源已被显式释放
            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 释放资源的核心实现,
        /// 之所以提供这样一个受保护的虚方法,是为了考虑到这个类型会被其他类继承的情况。如果类型存在一个子类,子类也许会实现自己的Dispose模式。受保护的虚方法用来提醒子类必须在实现自己的清理方法的时候注意到父类的清理工作,即子类需要在自己的释放方法中调用base.Dispose方法
        /// </summary>
        /// <param name="disposing">
        /// true: 由Dispose()方法调用(显式释放),需同时释放托管和非托管资源
        /// false: 由终结器调用(隐式释放),仅释放非托管资源
        /// </param>
        protected virtual void Dispose(bool disposing) {
            // 防止重复释放
            if (!disposed) {
                if (disposing) {
                    // 释放托管资源(如IDisposable对象)
                    // 示例: managedResource?.Dispose();
                }

                // 释放非托管资源(如文件句柄、数据库连接等)
                // 示例: CloseHandle(nativeHandle); nativeHandle = IntPtr.Zero;

                // 标记为已释放
                disposed = true;
            }
        }
    }

除非类直接管理非托管资源,否则没必要整这么麻烦,即使引用了Socket这种封装了非托管资源的类,也没必要整这么繁琐,完全可以简单粗暴的这样写,

    public class Example : IDisposable {
        Socket socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        /// <summary>
        /// 记得手动调用Dispose,或者使用using,即使忘记调用了,也会GC,但是GC的执行时机是不确定的,可能导致资源长时间无法释放
        /// </summary>
        public void Dispose() {
            socket.Dispose();
            socket = null!;
            GC.SuppressFinalize(this);
        }
    }