0

0

C#中的构造函数是什么 C#类的构造函数和析构函数详解

月夜之吻

月夜之吻

发布时间:2025-12-01 19:32:04

|

848人浏览过

|

来源于php中文网

原创

构造函数是C#中用于初始化对象的特殊方法,名称必须与类名相同,无返回类型,可重载且自动调用;若未定义,系统提供默认无参构造函数。例如:public class Person { public string Name { get; set; } public Person() { Name = "Unknown"; } public Person(string name) { Name = name; } } 使用时 Person p1 = new Person(); 调用无参构造函数,Person p2 = new Person("Alice"); 调用带参构造函数。构造函数支持重载,可通过 this() 调用同类其他构造函数以避免重复代码,如 public Rectangle() : this(1, 1) { }。静态构造函数用于初始化静态成员,无访问修饰符、无参数、仅执行一次,如 static Logger() { LogFile = "app.log"; }。析构函数以 ~ 开头,用于垃圾回收前清理非托管资源,不可手动调用,执行时机不确定,推荐实现 IDisposable 接口并配合 using 语句使用,如 public class FileManager : IDisposable { public void Dispose() { CleanUp(true); GC.SuppressFinalize(this); } ~FileManager() { CleanUp(false); } }。

c#中的构造函数是什么 c#类的构造函数和析构函数详解

构造函数是C#中用于初始化对象的特殊方法,它在创建类的实例时自动调用。与普通方法不同,构造函数没有返回类型,且名称必须与类名完全相同。它的主要作用是为对象的字段或属性设置初始值,确保对象处于一个有效的状态。

构造函数的基本特点

• 构造函数名称必须与类名一致
• 不能声明返回类型(即使是void也不行)
• 可以有参数,支持重载
• 创建对象时自动调用,不能手动调用
• 如果类中没有定义任何构造函数,C#会提供一个默认的无参构造函数

例如:

public class Person
{
    public string Name { get; set; }
    
    // 无参构造函数
    public Person()
    {
        Name = "Unknown";
    }

    // 带参构造函数
    public Person(string name)
    {
        Name = name;
    }
}

使用时:

Person p1 = new Person();           // 调用无参构造函数
Person p2 = new Person("Alice");     // 调用带参构造函数

构造函数的重载

C#允许在一个类中定义多个构造函数,只要它们的参数列表不同。这种机制称为构造函数重载,可以灵活地支持不同的对象初始化方式。

public class Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }

    public Rectangle() : this(1, 1) { }                    // 默认尺寸

    public Rectangle(int width) : this(width, width) { }   // 正方形情况

    public Rectangle(int width, int height)
    {
        Width = width;
        Height = height;
    }
}

这里使用 this() 调用同一个类中的其他构造函数,避免代码重复。

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

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

下载

静态构造函数

静态构造函数用于初始化类的静态成员。它只执行一次,且在第一次使用类之前由CLR自动调用。

• 没有访问修饰符
• 不能有参数
• 不能被直接调用
• 一个类只能有一个静态构造函数
public class Logger
{
    public static string LogFile;

    static Logger()
    {
        LogFile = "app.log";
        Console.WriteLine("日志系统已初始化");
    }
}

析构函数(Finalizer)

析构函数用于在对象被垃圾回收前执行清理工作,比如释放非托管资源。它由CLR自动调用,不能手动触发。

• 名称与类名相同,前面加 ~ 符号
• 没有访问修饰符、参数和返回值
• 一个类最多只能有一个析构函数
public class FileHandler
{
    private IntPtr filePtr;

    // 析构函数
    ~FileHandler()
    {
        if (filePtr != IntPtr.Zero)
        {
            // 释放非托管资源
            CloseHandle(filePtr);
            filePtr = IntPtr.Zero;
        }
    }

    [System.Runtime.InteropServices.DllImport("kernel32")]
    private static extern bool CloseHandle(IntPtr handle);
}

需要注意的是,析构函数的执行时间不可预测,因为它依赖于垃圾回收机制。因此,对于需要及时释放的资源,推荐实现 IDisposable 接口并使用 using 语句。

public class FileManager : IDisposable
{
    private bool disposed = false;

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

    ~FileManager()
    {
        CleanUp(false);
    }

    private void CleanUp(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // 释放托管资源
            }
            // 释放非托管资源
            disposed = true;
        }
    }
}

使用示例:

using (var manager = new FileManager())
{
    // 使用资源
} // 自动调用Dispose()
基本上就这些。构造函数确保对象正确初始化,析构函数辅助资源清理,但更推荐使用IDisposable模式来管理资源释放,以获得更好的控制力和性能。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

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

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

175

2023.11.23

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

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

97

2025.11.27

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

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

1023

2023.10.19

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

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

65

2025.10.17

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

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

420

2025.12.29

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

465

2024.01.03

python中class的含义
python中class的含义

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

13

2025.12.06

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 47.2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

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

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