C# 静态垃圾收集器?

C# 静态垃圾收集器?,c#,.net,constructor,garbage-collection,static-constructor,C#,.net,Constructor,Garbage Collection,Static Constructor,我有一个简单的类,它有一个静态构造函数和一个实例构造函数。现在,当我初始化这个类时,静态构造函数和实例构造函数都被调用。在应用程序域中只引用一次static。我可以再次调用相同的类初始化和静态构造函数初始化吗?我试过了,但没有成功?在类上使用垃圾收集后,是否有任何方法可以在main()方法中再次调用静态构造函数 代码如下: public class Employee { public Employee() { Console.WriteLine("Instance

我有一个简单的类,它有一个静态构造函数和一个实例构造函数。现在,当我初始化这个类时,静态构造函数和实例构造函数都被调用。在应用程序域中只引用一次static。我可以再次调用相同的类初始化和静态构造函数初始化吗?我试过了,但没有成功?在类上使用垃圾收集后,是否有任何方法可以在main()方法中再次调用静态构造函数

代码如下:

public class Employee
{
    public Employee()
    {
        Console.WriteLine("Instance constructor called");   
    }

    static Employee()
    {
        Console.WriteLine("Static constructor called");   
    }

    ~Employee()
     {
        //Dispose();
     }
}
现在在主方法调用中:

static void Main(string[] args)
{
    Employee emp = new Employee();
    Employee emp = new Employee();
}
输出:

静态构造函数调用 实例构造函数调用 实例构造函数调用

现在静电传感器没有再打电话了。因为它在应用程序域中只调用一次。但他们的任何方式,我们可以再次调用它,而无需卸载应用程序域。我们可以在这里使用GC类吗

谢谢。
Pal

除非您使用反射对其进行处理,否则静态构造函数(或者更一般地说,类型初始值设定项)仅在每个具体类、每个AppDomain中执行一次

请注意,对于泛型,使用不同的类型参数可以得到不同的具体类:

public class Foo<T>
{
    Foo()
    {
        Console.WriteLine("T={0}", typeof(T));
    }
    public static void DummyMethod() {}
}
...
Foo<int>.DummyMethod(); // Executes static constructor first
Foo<string>.DummyMethod(); // Executes static constructor first
Foo<string>.DummyMethod(); // Type is already initialized; no more output
公共类Foo
{
Foo()
{
WriteLine(“T={0}”,typeof(T));
}
公共静态void DummyMethod(){}
}
...
Foo.DummyMethod();//首先执行静态构造函数
Foo.DummyMethod();//首先执行静态构造函数
Foo.DummyMethod();//类型已初始化;没有更多的输出

不可能。CLR保留一个内部状态位,用于跟踪类型初始值设定项是否已启动。它不能再运行了。该状态位实际上作为AppDomain状态的一部分存储在加载程序堆中。解决方法很简单,只需向类中添加一个静态方法。

构造函数的要点是将事物置于所需的初始有效状态

实例构造函数将实例置于初始有效状态

接受参数的实例构造函数将实例置于反映其参数的初始有效状态

静态构造函数将类型置于初始有效状态。例如,初始化由类的静态方法使用或由所有实例共享的静态成员

理想情况下,所有方法都将使对象和类型保持有效状态,但构造函数的不同之处在于首先负责将其放入一个有效状态

因此,任何两次调用构造函数的尝试都是错误的,因为“再次将其置于初始有效状态”在逻辑上不能执行两次(“initial”和“reach”在同一子句中不起作用)。编译器(拒绝编译)和语言(无法表达)帮助我们避免了这样的事情

而且,这在逻辑上是不可能的,这不是你真正想要做的事情(好吧,我可以画一个有三条以上边的三角形,但只是说我做了)。这表明您正在使用构造函数执行某些操作,而不是设置初始有效状态

除了在构造函数中建立这样一个有效状态之外,做任何事情(如未能做到这一点)充其量都是一种优化,通常是一个严重的设计缺陷,并且很可能(更糟糕的是,因为它没有修复的时间更长)是一种尝试性优化,这确实是一个严重的设计缺陷

一个迹象表明,您的优化尝试实际上是一个设计缺陷,即您希望多次调用静态构造函数,或者对同一对象多次调用实例构造函数


确定所需的可重复行为,将其移动到单独的方法中,并根据需要从构造函数和其他地方调用它。然后再次检查您的设计逻辑,因为在类设计中发现这是一个相当严重的错误,并表明您有更深层次的问题。

您到底为什么要编写这些代码?@Developer:因为他可以:-D@DeveloperARt,那么请告诉我为什么在一个类中不能有多个静态构造函数?原因:-D…?静态构造函数用于一次性初始化。根据定义,一次性初始化只需要执行一次。如果你试图运行它不止一次,那就是你做错了。