C#构造函数

参考:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/constructors

一.实例构造函数

使用 new 表达式创建类的对象时,实例构造函数可用于创建和初始化任意实例成员变量。

1. 类

  • 如果某个类没有构造函数,则会自动生成一个无参数构造函数,并使用默认值来初始化对象字段。 例如,int 初始化为 0。

2. struct

  • structs 不包含显式无参数构造函数(不能申明无参构造函数),因为编译器将自动提供一个显式无参数构造函数。 此构造函数会将 struct 中的每个字段初始化为默认值
  • 但是,只有使用 new 实例化 struct 时,才会调用此无参数构造函数。 例如,此代码使用 Int32 的无参数构造函数,因此可确保整数已初始化:
int i = new int();  
Console.WriteLine(i); 

文档是这么说的,但实际不对:
但是,下面的代码会导致编译器错误,因为它不使用 new,而且尝试使用尚未初始化的对象:

int i;  
Console.WriteLine(i);  

或者,可将基于 structs 的对象(包括所有内置数值类型)初始化或赋值后使用,

二. 私有构造函数

如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。

  • 声明空构造函数可阻止自动生成无参数构造函数

  • 当没有实例字段或实例方法(例如 Math 类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。 如果类中的所有方法都是静态的,可考虑使整个类成为静态的。 有关详细信息,请参阅静态类和静态类成员。

注意:请注意,如果不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数(只写名字)。 但是,通常会显式地使用 private 修饰符来清楚地表明该类不能被实例化。

三. 静态构造函数

特点:

  • 静态构造函数不能继承或重载。

  • 静态构造函数不使用访问修饰符或不具有参数。

  • 类或结构只能有一个静态构造函数。

  • 静态构造函数不能直接调用,并且仅应由公共语言运行时 (CLR) 调用。 可以自动调用它们。

  • 用户无法控制在程序中执行静态构造函数的时间。

  • 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。 静态构造函数应在实例构造函数之前运行。 请注意,分配给事件或委托的静态方法被调用(而不是分配)时,将调用类型的静态构造函数。 如果静态构造函数类中存在静态字段变量初始值设定项,它们将在执行静态构造函数之前立即以在类声明中显示的文本顺序执行。

  • 如果未提供静态构造函数来初始化静态字段,会将所有静态字段初始化为其默认值,如默认值表中所列。

详细请参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

四. base和this关键字

  • 在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用无参数构造函数(若有)。 这意味着下面的构造函数声明等效:
//1.隐式
public Manager(int initialData)
{
    //Add further instructions here.
}

//2.显示
public Manager(int initialData) : base()
{
    //Add further instructions here.
}

如果基类没有提供无参数构造函数,派生类必须使用 base 显式调用基类构造函数。

  • 构造函数可以使用 this 关键字调用同一对象中的另一构造函数。
  • 和 base 一样,this 可带参数使用也可不带参数使用,构造函数中的任何参数都可用作 this 的参数,或者用作表达式的一部分。 例如:
public Employee(int weeklySalary, int numberOfWeeks) : this(weeklySalary * numberOfWeeks)
{
}

你可能感兴趣的:(C#构造函数)