C#中的静态构造函数是什么?

3

我有几个问题涉及C#中的静态构造函数。

  1. 什么是静态构造函数,它们如何与非静态构造函数不同。
  2. 我们如何在应用程序中使用它们?

**已编辑

public class Test
{
    // Static constructor:
    static Test()
    {
        Console.WriteLine("Static constructor invoked.");
    }

    public static void TestMethod()
    {
       Console.WriteLine("TestMethod invoked.");
    }
}

class Sample
{
    static void Main()
    {
        Test.TestMethod();
    }
}

输出: 静态构造函数被调用。 TestMethod被调用。 所以,这意味着静态构造函数只会被调用一次。如果我们再次调用Test.TestMethod(); 静态构造函数不会被调用。
任何指针或建议将不胜感激。
谢谢。

1
例如,每次初始化静态字段时,您都在使用隐式生成的静态构造函数。 - SK-logic
@SK-logic: <术语细节>在那种情况下,您没有使用隐式生成的静态构造函数:您正在使用类型初始化程序。不存在隐式静态构造函数。一个类要么有显式静态构造函数,要么没有静态构造函数。</术语细节> - LukeH
查看任何具有初始化为某些值的静态字段的类的 ildasm /text 输出 - 您将在那里看到一个隐式生成的静态构造函数。 - SK-logic
.method private hidebysig specialname rtspecialname static void .cctor() cil managed - 与 C# 生成的静态构造函数具有完全相同的签名和属性。 - SK-logic
@SK-logic:我提到这只是一个术语上的小问题,不是吗?C#类型要么有显式静态构造函数要么没有静态构造函数;不存在隐式静态构造函数。C#编译器将源代码转换为IL;如果C#源代码包含要么静态构造函数要么在声明中初始化的静态字段,则该逻辑将被编译到生成的类型初始化程序中。 - LukeH
显示剩余4条评论
3个回答

8

静态构造函数是当类被加载时仅执行一次的构造函数。常规(非静态)构造函数在每次创建对象时都会执行。

看下面这个例子:

public class A
{
     public static int aStaticVal;
     public int aVal;

     static A() {
         aStaticVal = 50;
     }

     public A() {
         aVal = aStaticVal++;
     }
}

考虑以下代码:

A a1 = new A();
A a2 = new A();
A a3 = new A();

这里,static构造函数将首先被调用,并且仅在程序执行期间调用一次。而常规构造函数将被调用三次(每个对象实例化一次)。
通常使用static构造函数来初始化静态字段,例如为静态字段分配初始值。请记住,您只能在static构造函数中访问static成员(方法、属性和字段)。
如果需要“多次执行静态构造函数”,则无法实现。相反,您可以将要“多次运行”的代码放在一个静态方法中,并在需要时调用它。例如:
```csharp public static class MyClass { public static void MyMethod() { // Code to be executed multiple times. } } ```
public class A {
    public static int a, b;
    static A() {
         A.ResetStaticVariables();
    }
    public static void ResetStaticVariables() {
        a = b = 0;
    }
}

1
静态构造函数不需要访问修饰符。应该只是 static A() {...}。请参见此处:http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=VS.100).aspx - Paul Sasik
@Pablo:没问题。不为这种情况指定访问修饰符看起来和感觉都很不自然。 - Paul Sasik
@Paul 解释得非常好 :) 谢谢!!还有一件事,在类被加载后或在运行时的任何时刻,我们无法再次执行静态构造函数,对吗? - Shaitender Singh
@Monu:没错,运行时会为你执行静态构造函数。你永远不需要自己调用构造函数。如果你需要在程序执行后调用它,可以编写一个静态方法。 - Pablo Santa Cruz
@Monu:根据我之前告诉你的关于多次调用静态构造函数的方法,我更新了答案并提供了一个小例子。 - Pablo Santa Cruz

2

您使用静态构造函数的方式与实例构造函数的方式相同 - 用于设置默认值。不同之处在于您将初始化静态字段,因此静态构造函数仅执行一次。

请注意,在进行对类的首次调用之前,静态构造函数中的代码将不会被执行。


只有在第一次调用时才会触发,但在类加载之前。静态字段访问也会触发它。 - SK-logic
@SK-Logic 是的,那就是我想表达的意思。MSDN 的引用可以澄清:“在创建第一个实例或引用任何静态成员之前,静态构造函数将自动调用以初始化类。” - Dyppl

1

当类被加载时它运行。

它将打印: {

  1. 来自静态A的问候
  2. A

}

public class A{
  static A{
     print("hi from static A");
  }

  public A() {
    print("A");
  }

  main() {
      new A();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接