C#构造函数

C# 中,构造函数就是与类(或结构体)具有相同名称的成员函数,它在类中的地位比较特殊,不需要我们主动调用,当创建一个类的对象时会自动调用类中的构造函数。在程序开发的过程中,我们通常使用类中的构造函数来初始化类中的成员属性。

C# 中的构造函数有三种:
  • 实例构造函数;
  • 静态构造函数;
  • 私有构造函数。

1、实例构造函数

构造函数是类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。当我们使用 new 关键字创建类的对象时,可以使用实例构造函数来创建和初始化类中的任意成员属性。下面示例中演示了一个名为 Person 的类,以及类中的实例构造函数。
public class Person{
    private string name;
    private int age;

    public Person(string n, int a)
    {
        name = n;
        age = a;
    }
    // 类中剩余的成员
}
只要创建 Person 类的对象,就会调用类中的实例构造函数,我们只需要在实例化对象时将具体的值传递给类中的构造函数即可,如下所示:

Person P = new Person("张三", 18);

如果没有为类显式的创建构造函数,那么 C# 将会为这个类隐式的创建一个没有参数的构造函数(无参数构造函数),这个无参的构造函数会在实例化对象时为类中的成员属性设置默认值(关于 C# 中类型的默认值大家可以查阅《数据类型》一节)。在结构体中也是如此,如果没有为结构体创建构造函数,那么 C# 将隐式的创建一个无参数的构造函数,用来将每个字段初始化为其默认值。

若要初始化静态类或非静态类中的静态属性,则需要使用下面将要介绍的静态构造函数。

2、静态构造函数

静态构造函数用于初始化类中的静态数据或执行仅需执行一次的特定操作。静态构造函数将在创建第一个实例或引用类中的静态成员之前自动调用。

静态构造函数具有以下特性:
  • 静态构造函数不使用访问权限修饰符修饰或不具有参数;
  • 类或结构体中只能具有一个静态构造函数;
  • 静态构造函数不能继承或重载;
  • 静态构造函数不能直接调用,仅可以由公共语言运行时 (CLR) 调用;
  • 用户无法控制程序中静态构造函数的执行时间;
  • 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类;
  • 静态构造函数会在实例构造函数之前运行。

【实例】下面通过一个示例来演示实例构造函数与静态构造函数:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        public static int num = 0;
        // 构造函数
        Demo(){
            num = 1;
        }
        // 静态构造函数
        static Demo(){
            num = 2;
        }
        static void Main(string[] args) 
        {
            Console.WriteLine("num = {0}", num);
            Demo Obj = new Demo();
            Console.WriteLine("num = {0}", num);
            Console.Read();
        }
    }
}
当执行上面程序时,会首先执行 public static int num = 0,接着执行类中的静态构造函数,此时 num = 2,然后执行 Main 函数里面的内容,此时打印 num 的值为 2,接着初始化 Demo 类,这时会执行类中的构造函数,此时 num 会重新赋值为 1,所以上例的运行结果如下所示:

num = 2
num = 1

3、私有构造函数

私有构造函数是一种特殊的实例构造函数,通常用在只包含静态成员的类中。如果一个类中具有一个或多个私有构造函数而没有公共构造函数的话,那么其他类(除嵌套类外)则无法创建该类的实例。 例如:
class NLog
{
    // 私有构造函数
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}
上例中定义了一个空的私有构造函数,这么做的好处就是空构造函数可阻止自动生成无参数构造函数。需要注意的是,如果不对构造函数使用访问权限修饰符,则默认它为私有构造函数。

【示例】下面通过一个示例来演示私有构造函数的使用:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args) 
        {
            // Student stu = new Student();
            Student.id = 101;
            Student.name = "张三";
            Student.Display();
            Console.Read();
        }
    }
    public class Student
    {
        private Student() { }
        public static int id;
        public static string name;
        public static void Display()
        {
            Console.WriteLine("姓名:"+name+" 编号:"+id);
        }
    }
}
运行结果如下:

姓名:张三 编号:101

注意,上述代码中,如果取消 Main 函数中注释的 Student stu = new Student();,程序就会出错,因为 Student 类的构造函数是私有静态函数,受其保护级别的限制不能访问。