0

0

c# 构造函数和析构函数

星降

星降

发布时间:2026-01-06 09:41:02

|

774人浏览过

|

来源于php中文网

原创

构造函数需无返回类型、名同类名、不可显式调用;推荐this链式调用、字段非空校验、避免虚方法调用;析构函数非资源清理首选,仅作非托管资源兜底;Dispose模式须配合GC.SuppressFinalize实现两阶段清理。

c# 构造函数和析构函数

构造函数怎么写才不会出错

构造函数不是普通方法,它没有返回类型(连 void 都不能写),名字必须和类名完全一致,且不能被显式调用。常见错误是加了 void 或拼错类名,编译器会直接报错:CS0501: 'X.X()' must declare a body because it is not marked abstract, extern, or partial

建议做法:

  • 多个构造函数之间用 this(...) 链式调用,避免重复初始化逻辑
  • 如果类有字段需要非空校验,优先在构造函数里检查并抛出 ArgumentNullException
  • 不要在构造函数里调用虚方法(virtualabstract),子类可能尚未完成初始化,容易引发未定义行为
public class Person
{
    public string Name { get; }
    public int Age { get; }
public Person(string name) : this(name, 0) { }

public Person(string name, int age)
{
    Name = name ?? throw new ArgumentNullException(nameof(name));
    Age = Math.Max(0, age);
}

}

析构函数不是“资源清理首选”

C# 的析构函数(即 ~ClassName())本质是编译器生成的 Finalize() 重写,它由 GC 在不确定时间调用,**不能保证执行时机,也不能保证一定执行**。它不适用于释放文件句柄、数据库连接、网络流等需要及时释放的资源。

真正该用的是 IDisposable 接口 + using 语句。析构函数只应在极少数场景下作为“安全网”:当用户忘记调用 Dispose(),且你持有非托管资源(如通过 Marshal.AllocHGlobal 分配的内存)时,才在析构函数里做兜底释放。

注意点:

Python函数 文件与模块 中文WORD版
Python函数 文件与模块 中文WORD版

本文档主要讲述的是Python 函数、文件与模块,本文构造一个完整的 Python 程序。引入了 Python 函数和模块,并展示了构建一个 Python 程序、将其存储在文件中以及通过命令行运行该程序的方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载
  • 析构函数不能带访问修饰符(不能写 public ~MyClass()
  • 一个类最多只能有一个析构函数,且不能被继承或重载
  • 如果实现了 IDisposable,应在 Dispose(bool) 中调用 GC.SuppressFinalize(this),防止析构函数被重复执行

Dispose 模式怎么配合析构函数写

标准 Dispose 模式不是可选项,而是处理混合资源(托管 + 非托管)的强制约定。核心是两阶段清理:用户调用 Dispose() 时走快速路径;GC 调用析构函数时走慢速兜底路径。

关键结构:

  • Dispose() 方法只负责标记已释放,并调用 Dispose(true)
  • Dispose(bool disposing) 中,disposing == true 表示可安全访问托管对象;false 表示只能操作非托管资源
  • 析构函数里只调用 Dispose(false),绝不调用任何托管对象的方法或属性
public class FileReader : IDisposable
{
    private bool _disposed = false;
    private IntPtr _fileHandle = IntPtr.Zero;
~FileReader()
{
    Dispose(false);
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (_disposed) return;

    if (disposing)
    {
        // 可以安全释放托管资源,比如关闭 StreamReader
    }

    // 总是释放非托管资源
    if (_fileHandle != IntPtr.Zero)
    {
        Marshal.FreeHGlobal(_fileHandle);
        _fileHandle = IntPtr.Zero;
    }

    _disposed = true;
}

}

为什么 new 之后没调用析构函数

这是最常被误解的一点:析构函数不是“对象销毁时自动触发”,而是“GC 决定回收该对象内存前,可能调用 Finalizer 队列里的方法”。这意味着:

  • 程序运行中几乎看不到析构函数执行——GC 可能一直不触发,尤其内存充足时
  • 即使调用了 GC.Collect(),析构函数也不会立刻执行,而是被放入终结队列,由专用线程异步调用
  • 如果对象在 Finalizer 运行前又被其他地方引用(例如在析构函数里把 this 存进静态集合),它会被提升到更高代,析构延迟更久甚至永不执行

所以别靠打印日志验证析构函数是否工作,更别在里面写业务逻辑。它的存在意义只有一个:防止非托管资源泄漏的最后防线,仅此而已。

相关专题

更多
javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

174

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

94

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1004

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

56

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

340

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2072

2023.08.14

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 6.2万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号