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

📅  最后修改于: 2021-05-29 23:45:13             🧑  作者: Mango

先决条件:C#中的构造函数

静态构造函数用于初始化类的静态成员,并在创建类的第一个实例之前隐式调用。非静态构造函数用于初始化类的非静态成员。以下是静态构造函数和非静态构造函数之间的区别。

  • 声明:静态构造函数是使用static修饰符显式声明的,而其他所有其余构造函数都是非静态构造函数。非静态构造函数也可以称为实例构造函数,因为它们需要实例才能执行。
    例子:
C#
// C# Program to demonstrate
// how to declare the static
// constructor and non-static
// constructor
using System;
 
class Geeks{
   
// Static variable
static int s;
 
// Non-static variable
int ns;
 
// Declaration of
// static constructor
static Geeks()
{
    Console.WriteLine("It is static constructor");
}
 
// Declaration of
// non-static constructor
public Geeks()
{
    Console.WriteLine("It is non-static constructor");
}
 
// Main Method
static void Main(string[] args)
{
 
    // Static constructor will call implicitly
    // as soon as the class start to execute
    // the first block of code to execute
    // will be static constructor
 
    // Calling non-static constructor
    Geeks obj1 = new Geeks();
}
}


C#
// C# Program to demonstrate
// the execution of static
// constructor and non-static
// constructor
using System;
 
class Geeks{
 
// Declaration of
// static constructor
static Geeks()
{
    Console.WriteLine("Static constructor");
}
 
// Declaration of
// non-static constructor
public Geeks()
{
    Console.WriteLine("Non-Static constructor");
}
 
// Main Method
static void Main(string[] args)
{
 
    // static constructor will call implicitly
    // as soon as the class start to execute
    // the first block of code to execute
    // inside the class will be static
    // constructor
 
    // calling non-static constructor
    // here we are calling non-static
    // constructor twice as we are
    // creating two objects
    Geeks obj1 = new Geeks();
    Geeks obj2 = new Geeks();
}
}


C#
// C# Program to demonstrate
// initialization of fields
// by using static constructor
// and non-static constructor
using System;
 
class Geeks{
     
// Static variable
static int s;
 
// Non-static variable
int ns;
 
// Declaration of
// static constructor
static Geeks()
{
    Console.WriteLine("Static constructor");
}
 
// Declaration of
// non-static constructor
public Geeks()
{
    Console.WriteLine("Non-Static constructor");
}
 
// Main Method
static void Main(string[] args)
{
 
    // Static fields can
    // be accessed directly
    Console.WriteLine("Value of s is: " + s);
 
    // Calling non-static constructor
    Geeks obj1 = new Geeks();
 
    // Printing the value
    // of non-static field
    Console.WriteLine("Value of ns is: " + obj1.ns);
}
}


C#
// C# Program to demonstrate
// the passing of paramters
// to constructor
using System;
 
class Geeks {
 
    // static variable
    static int s;
 
    // non-static variable
    int ns;
 
    // declaration of
    // static constructor
    // and passing parameter
    // to static constructor
    static Geeks(int k)
    {
 
        k = s;
        Console.WriteLine("Static constructor & K = " + k);
    }
 
    // declaration of
    // non-static constructor
    Geeks()
    {
        Console.WriteLine("Non-Static constructor");
    }
 
    // Main Method
    static void Main(string[] args)
    {
    }
}


输出:

It is static constructor
It is non-static constructor
  • 调用:静态构造函数始终被隐式调用,但是非静态构造函数被显式调用,即通过创建类的实例。
    示例:在上面的程序中,我们有静态构造函数,即静态Geeks() ,它在main方法中隐式调用。仔细查看输出,静态构造函数中的代码正在执行。但是要调用非静态构造函数Geeks() ,您需要创建该类的实例,即obj1 。因此,对象的创建是显式调用非静态构造函数。
  • 执行:静态构造函数在类开始执行时立即执行,这是在类下运行的第一个代码块。但是非静态构造函数仅在创建类的实例之后执行。每次创建该类的实例时,它将调用非静态构造函数。
    例子:

C#

// C# Program to demonstrate
// the execution of static
// constructor and non-static
// constructor
using System;
 
class Geeks{
 
// Declaration of
// static constructor
static Geeks()
{
    Console.WriteLine("Static constructor");
}
 
// Declaration of
// non-static constructor
public Geeks()
{
    Console.WriteLine("Non-Static constructor");
}
 
// Main Method
static void Main(string[] args)
{
 
    // static constructor will call implicitly
    // as soon as the class start to execute
    // the first block of code to execute
    // inside the class will be static
    // constructor
 
    // calling non-static constructor
    // here we are calling non-static
    // constructor twice as we are
    // creating two objects
    Geeks obj1 = new Geeks();
    Geeks obj2 = new Geeks();
}
}

输出:

Static constructor
Non-Static constructor
Non-Static constructor
  • 说明:在上面的程序中,创建了Geeks()类的两个对象,即obj1obj2 。 obj1和obj2将两次调用非静态构造函数,因为每次创建该类的实例时,它都会调用非静态构造函数。尽管在Main方法(程序的入口点)中,第一个语句是“ Geeks obj1 = new Geeks(); ”,但是一旦编译器发现Main Method控件将转移到class,并且静态块将首先执行。这就是为什么您可以在输出中看到首先调用静态构造函数的原因。
  • 执行时间:静态构造函数将在类的整个生命周期中始终执行一次。但是,如果没有创建类的实例,则非静态构造函数可以执行零次,如果创建n个实例,则可以执行n次。
    示例:在上面的程序中,您可以看到静态构造函数只执行一次,但非静态构造函数执行2次,因为创建了该类的两个实例。如果您不创建该类的实例,则非静态构造函数将不会执行。
  • 字段的初始化:静态构造函数用于初始化静态字段,非静态构造函数用于初始化非静态字段。
    例子:

C#

// C# Program to demonstrate
// initialization of fields
// by using static constructor
// and non-static constructor
using System;
 
class Geeks{
     
// Static variable
static int s;
 
// Non-static variable
int ns;
 
// Declaration of
// static constructor
static Geeks()
{
    Console.WriteLine("Static constructor");
}
 
// Declaration of
// non-static constructor
public Geeks()
{
    Console.WriteLine("Non-Static constructor");
}
 
// Main Method
static void Main(string[] args)
{
 
    // Static fields can
    // be accessed directly
    Console.WriteLine("Value of s is: " + s);
 
    // Calling non-static constructor
    Geeks obj1 = new Geeks();
 
    // Printing the value
    // of non-static field
    Console.WriteLine("Value of ns is: " + obj1.ns);
}
}

输出:

Static constructor
Value of s is: 0
Non-Static constructor
Value of ns is: 0
  • 说明:在此,静态和非静态字段均使用默认值初始化。 int类型的默认值为零。静态构造函数将仅初始化静态字段。这里的静态场是s 。非静态字段( ns )由非静态构造函数初始化。
  • 参数:我们不能将任何参数传递给静态构造函数,因为它们是隐式调用的,而对于传递参数,我们必须显式调用它,这是不可能的。它将给出运行时错误,如下例所示。但是,我们可以将参数传递给非静态构造函数。
    例子:

C#

// C# Program to demonstrate
// the passing of paramters
// to constructor
using System;
 
class Geeks {
 
    // static variable
    static int s;
 
    // non-static variable
    int ns;
 
    // declaration of
    // static constructor
    // and passing parameter
    // to static constructor
    static Geeks(int k)
    {
 
        k = s;
        Console.WriteLine("Static constructor & K = " + k);
    }
 
    // declaration of
    // non-static constructor
    Geeks()
    {
        Console.WriteLine("Non-Static constructor");
    }
 
    // Main Method
    static void Main(string[] args)
    {
    }
}

运行时错误:

  • 重载:可以重载非静态构造函数,但不能重载静态构造函数。重载是根据参数条件完成的。因此,如果您无法将参数传递给Static构造函数,则无法对其进行重载。
  • 案件中,构造函数是隐式:除了静态类每类(只包含静态成员)总是包含如果用户没有定义任何显式构造的隐式构造函数。如果该类包含任何静态字段,则隐式定义静态构造函数。