MST

星途 面试题库

面试题:C#中构造函数与析构函数的区别

请详细阐述C#中构造函数与析构函数在定义、调用时机、功能以及语法规则上有哪些区别。
10.7万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

定义

  • 构造函数: 构造函数是一种特殊的成员函数,其名称与类名相同。用于初始化对象的状态,为对象的字段赋值等操作。例如:
public class MyClass
{
    public int Number { get; set; }
    public MyClass(int num)
    {
        Number = num;
    }
}
  • 析构函数: 析构函数也是特殊的成员函数,名称为类名前加波浪线~。用于在对象被垃圾回收器回收之前执行清理操作,如释放非托管资源。例如:
public class MyClass
{
    ~MyClass()
    {
        // 清理代码
    }
}

调用时机

  • 构造函数: 在使用new关键字创建对象时被自动调用。例如:MyClass obj = new MyClass(5); 此时构造函数MyClass(int num)被调用。
  • 析构函数: 析构函数由垃圾回收器(GC)在确定对象不再被使用且准备回收对象占用的内存时调用。但无法准确预测其具体调用时间,也不能手动调用。

功能

  • 构造函数: 主要功能是初始化对象的成员变量,确保对象在创建后处于一个有效的初始状态。例如为类中的属性赋值,连接数据库等初始化操作。
  • 析构函数: 主要用于释放对象使用的非托管资源,如文件句柄、数据库连接等。防止资源泄漏,确保资源在对象销毁时得到正确的清理。

语法规则

  • 构造函数
    • 可以有参数,通过参数可以灵活地初始化对象的不同状态。
    • 可以有多个构造函数,即构造函数重载,以适应不同的初始化需求。
    • 构造函数可以使用访问修饰符(如publicprivateprotected等),以控制构造函数的可访问性。例如private构造函数常用于实现单例模式。
  • 析构函数
    • 不能有参数,因为其调用由系统控制,不需要外部传递参数。
    • 一个类只能有一个析构函数,不支持析构函数重载。
    • 析构函数不能使用访问修饰符,它的访问修饰符是隐式的,并且不能被继承。