C#构造函数用法详解
在 C# 中,构造函数是一个特殊的函数,它是在创建对象时执行的方法。构造函数具有与类相同的名称,通常用来初始化对象的数据成员。
构造函数的特点如下:
例如,下面的代码定义了一个 Plane 类。
例如,下面的代码是错误的:
图 1 使用无参构造函数创建对象时出现的错误提示
上面的错误主要是由于程序中已经定义了一个有参构造函数,这时在创建对象时,如果想要使用无参构造函数,就必须进行显式定义。
修改后的代码如下:
但是,如果类中只定义了私有构造函数,将导致类不能使用 new 运算符在外部代码中实例化,例如下面的代码。
可以通过编写一个公共的静态属性或者方法来解决这个问题,代码如下。
编写静态构造函数的主要原因是类有一些静态字段或者属性,需要在第一次使用类之前从外部源中初始化这些静态字段和属性。
定义静态构造函数时,不能设置访问修饰符,因为其他 C# 代码从来不会调用它,它只在引用类之前执行一次。另外,静态构造函数不能带任何参数,而且一个类中只能有一个静态构造函数,它只能访问类的静态成员,不能访问实例成员。
例如,下面的代码定义了一个静态构造函数。
创建一个控制台应用程序,在 Program 类中定义一个静态构造函数和一个实例构造函数,然后在 Main 方法中创建 3 个 Program 类的对象,代码如下。
构造函数的特点如下:
- 构造函数没有返回值;
- 构造函数的名称要与本类的名称相同。
构造函数的定义
构造函数的定义语法格式如下:public class className { public className () //无参构造函数 { } public className (int args) //有参构造函数 { args = 2 + 3; } }
- public:构造函数的访问修饰符。
- className:类的名字(构造函数名与此同名)。
- args:构造函数的参数。
默认构造函数和有参构造函数
定义类时,如果没有定义构造函数,则编译器会自动创建一个不带参数的默认构造函数。例如,下面的代码定义了一个 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
实例构造函数
实例构造函数
实例构造函数