首页 > 编程笔记

C#构造函数用法详解

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

构造函数的特点如下:

构造函数的定义

构造函数的定义语法格式如下:
public class className
{
    public className ()        //无参构造函数
    {
    }
    public className (int args) //有参构造函数
    {
        args = 2 + 3;
    }
}

默认构造函数和有参构造函数

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

例如,下面的代码定义了一个 Plane 类。
class Plane
{
}
在创建 Plane 类的对象时,可以直接使用如下代码。
Plane plane = new Plane();
但是,如果在定义类时定义了含有参数的构造函数,这时如果还想要使用默认构造函数,就需要显式地进行定义了。

例如,下面的代码是错误的:
class Plane
{
     private int x;//飞机的x坐标
     private int y;//飞机的y坐标
     public Plane(int x,int y)//有参构造函数
     {
         this.x = x;
         this.y = y;
     }
     void ShowInfo()
     {
         Plane book = new Plane();
     }
}
上面的代码在运行时,将会出现下图所示的错误提示。


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

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

修改后的代码如下:
class Plane
{
    private int x;           //飞机的x坐标
    private int y;           //飞机的y坐标
    public Plane()           //无参构造函数
    {
    }
    public Plane(int x,int y)//有参构造函数
    {
         this.x = x;
         this.y = y;
     }
     void ShowInfo()
     {
         Plane book = new Plane();
     }
}

私有构造函数

定义构造函数时,也可以使用 private 进行修饰,用于表示构造函数只能在本类中访问,其他类不能访问。

但是,如果类中只定义了私有构造函数,将导致类不能使用 new 运算符在外部代码中实例化,例如下面的代码。
class Plane
{
    private Plane()
    {
    }
}
上面的代码在 Plane 类中只定义了一个私有构造函数,这时如果要在其他类中创建 Plane 类的对象该怎么办呢?

可以通过编写一个公共的静态属性或者方法来解决这个问题,代码如下。
class Plane
{
    private Plane() { }           //私有构造函数
    public static Plane newPlane()//创建静态方法,返回本类实例对象
    {
        return new Plane();
    }
    static void Main(string[] args)
    {
        Plane plane = Plane.newPlane();
    }
}
提示,利用私有构造函数可以实现一种常见的设计模式——单例模式,即同一类创建的所有对象都是同一个实例。

静态构造函数

在 C# 中,可以为类定义静态构造函数,这种构造函数只执行一次。

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

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

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

创建一个控制台应用程序,在 Program 类中定义一个静态构造函数和一个实例构造函数,然后在 Main 方法中创建 3 个 Program 类的对象,代码如下。
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
实例构造函数
实例构造函数
实例构造函数

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

推荐阅读

副业交流群 关注微信公众号,加入副业交流群,学习变现经验,交流各种打法。