首页 > 编程笔记 > C#笔记 阅读:2

C#中的构造函数和析构函数(附带实例)

C# 中的构造函数是一个特殊的函数,它是在创建对象时执行的方法,构造函数具有与类相同的名称,它通常用来初始化对象的数据成员。

构造函数的特点如下:

C#构造函数的使用

构造函数的语法如下:
public class Book
{
    public Book()                // 无参数构造方法
    {
    }
    public Book(int args)        // 有参数构造方法
    {
        args = 2 + 3;
    }
}

1) C#默认构造函数和有参构造函数

在定义类时,如果没有定义构造函数,编译器就会自动创建一个不带参数的默认构造函数。

例如,定义一个 Book 类,代码如下:
class Book
{
}

在创建 Book 类的对象时,可以直接使用如下代码:
Book book = new Book();

但是,如果在定义类时,定义了含有参数的构造函数,这时如果想要使用默认构造函数,就需要进行显式定义,例如,下面的代码:
class Book
{
    public string Name { get; set; }
    public Book(string name)
    {
        Name = name;
    }
    void ShowInfo()
    {
        Book book = new Book();
    }
}
在运行时,就会出现如下图所示的错误提示:


图 1 使用无参构造函数创建对象时的错误提示

上面的错误主要是由于程序中已经定义了一个有参的构造函数,这时创建对象,如果想要使用无参构造函数,就必须进行显式定义。

2) C#静态构造函数

在 C# 中,可以为类定义静态构造函数,这种构造函数只执行一次。编写静态构造函数的主要原因是,类有一些静态字段或者属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。

定义静态构造函数时,不能设置访问修饰符,因为其他 C# 代码从来不会调用它,它只在引用类之前执行一次。另外,静态构造函数不能带任何参数,而且一个类中只能有一个静态构造函数,它只能访问类的静态成员,不能访问实例成员。

例如,定义一个静态构造函数,代码如下:
static Program()
{
    Console.WriteLine("static");
}
在类中,静态构造函数和无参数的实例构造函数是可以共存的,因为静态构造函数是在加载类时执行,而实例构造函数是在创建类的对象时执行的。

【实例】静态构造函数和实例构造函数的使用。首先创建一个控制台应用程序,并在 Program 类中定义一个静态构造函数和一个实例构造函数,然后在 Main 方法中创建 3 个 Program 类的对象。代码如下:
public class Program
{
    static Program()                // 静态构造函数
    {
        Console.WriteLine("static");
    }
    private Program()               // 实例构造函数
    {
        Console.WriteLine("实例构造函数");
    }
    static void Main(string[] args)
    {
        Program p1 = new Program();  // 创建类的对象p1
        Program p2 = new Program();  // 创建类的对象p2
        Program p3 = new Program();  // 创建类的对象p3
        Console.ReadLine();
    }
}
程序运行结果为:

static
实例构造函数
实例构造函数
实例构造函数

从运行结果可以看出,静态构造函数只在引用类之前执行了一次,而实例构造函数则每创建一个对象都会执行一次。

C#析构函数的使用

析构函数主要用来释放对象资源,.NET Framework 类库有垃圾回收功能,当某个类的实例被认为不再有效,并符合析构条件时,.NET Framework 类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收。

析构函数是以类名加前缀“~”来命名的,例如,为 Program 类定义一个析构函数,代码如下:
~Program()                    // 析构函数
{
    Console.WriteLine("析构函数自动调用");
}
严格地说,析构函数是自动调用的,不需要开发人员显式定义。如果需要定义析构函数,一个类中只能定义一个析构函数。

构造函数和析构函数是类中比较特殊的两种成员函数,主要用来对对象进行初始化和释放对象资源。一般来说,对象的生命周期从构造函数开始,以析构函数结束。

相关文章