C# 中静态构造函数和非静态构造函数的区别

17 Mar 2025 | 4 分钟阅读

在 C# 中,构造函数 是在创建对象时自动调用的类方法。这些构造函数用于使用某些值初始化对象。构造函数与类名相同,并且没有返回类型。

有静态构造函数、非静态构造函数、默认构造函数和参数化构造函数。如果一个构造函数接受参数,则称为参数化构造函数,而默认构造函数不带参数。

如果一个构造函数初始化静态成员,则称为静态构造函数,而非静态构造函数则初始化实例成员。

静态构造函数

静态构造函数 用于初始化类的静态成员。它不接受任何参数,并且其声明不包含访问修饰符或 “static” 关键字。静态构造函数只执行一次。通常,它发生在访问类的任何静态成员或调用静态方法之前。静态构造函数不能具有 public 或 private 等访问修饰符。运行时会自动调用它。

语法

它具有以下语法:

示例

让我们以一个 C# 程序来说明 静态构造函数。

输出

Difference between Static Constructors and Non-Static Constructors in C#

说明

C# 程序定义了一个名为 MyClass 的类,其中包含一个静态变量 staticVariable 和一个静态构造函数 (static MyClass()) ,该构造函数将此变量初始化为 100。程序在 MyClass 中包含一个静态方法 PrintStaticVariable() ,该方法打印静态变量的值。在 Program 类的 Main 方法中,对 MyClass 类型调用了两次静态方法 PrintStaticVariable() ,导致静态构造函数仅执行一次。程序输出显示消息 “Static constructor is called” 一次,这证实了静态构造函数只执行一次,然后打印静态变量的值两次,表明静态变量在多次调用静态方法时保持其值。该程序演示了如何使用静态构造函数仅初始化一次静态成员,即使静态方法被多次调用。

非静态构造函数

非静态构造函数 也称为实例构造函数。实例构造函数用于初始化类的实例成员。非静态构造函数具有类名,并且可以接受参数。当使用 “new” 关键字创建类的实例时,它会被执行。非静态构造函数可以具有 public 或 private 等访问修饰符,从而控制构造函数的可见性。

语法

它具有以下语法:

示例

让我们以一个 C# 程序来说明非静态构造函数。

输出

Difference between Static Constructors and Non-Static Constructors in C#

说明

C# 程序定义了一个名为 MyClass 的类,其中包含一个实例变量 instanceVariable 和一个非静态构造函数 (public MyClass(int value)) ,该构造函数使用指定的值初始化此变量。在 Program 类的 Main 方法中,使用 new 关键字创建了两个具有不同值的 MyClass 实例。对于每个实例,都会调用非静态构造函数,显示消息“Non-static constructor is called”。随后,程序为每个对象调用 PrintInstanceVariable() 方法,打印其实例变量的相应值。本质上,该程序通过非静态构造函数演示了具有唯一状态的实例的创建,突出了类中实例特定行为的封装。

静态构造函数和非静态构造函数之间的区别

Difference between Static Constructors and Non-Static Constructors in C#

C# 中的 静态非构造函数 之间有几个区别。一些主要区别如下:

静态构造函数非静态构造函数
这些与类本身相关。这些与类的实例相关。
在访问任何静态成员或调用方法之前,它们只执行一次。每次使用“new”关键字创建类实例时都会执行这些。
静态构造函数在没有访问修饰符和“static”关键字的情况下声明。这些使用可选的访问修饰符(public、private 等)声明。
这些构造函数不能接受参数。非静态构造函数可以接受参数。
它们由运行时自动调用。在创建对象时,使用“new”关键字显式调用它们。
这些用于一次性初始化静态成员。这些用于初始化实例(非静态)成员。
静态构造函数只能访问静态成员并调用其他静态方法。非静态构造函数可以访问静态成员和实例成员,包括其他实例方法。
这些不能被重载或由用户代码显式调用。这些可以重载,允许多个具有不同参数的构造函数。
静态构造函数不能用于后期绑定。这些构造函数用于后期绑定,允许使用不同的参数创建多个构造函数。
初始化顺序由代码中静态成员的声明顺序确定。初始化顺序由构造过程中非静态成员的执行顺序确定。

结论

静态构造函数 与类本身相关,并用于一次性初始化静态成员。相比之下,非静态构造函数 与类的实例相关,并用于在创建对象时初始化实例成员。