c#静态构造函数问题

时间:2010-11-12 10:33:29

标签: c#

以下代码不会调用类静态构造函数。这是一个错误或功能吗?

class Test
{
    static Test
    {
       //do stuff
    }
    public static AnotherClass ClassInstance { get; set; }
}

class Program
{
    public static void Main()
    {
        var x = Test.ClassInstance;
    }
}

我现在没有编译器,但这就是我今天发生的事情。永远不会调用静态构造函数,但是当ClassInstance是一个字段时调用它。

编辑: 我知道在创建第一个实例或访问字段时会调用静态构造函数。自动实现的属性背后是否有一个字段?

我正在寻找一些解释,当属性实现为两个函数和一个字段时,属性为什么不触发静态构造函数。这对我来说非常不合逻辑,这就是为什么我认为它可能是一个错误。

4 个答案:

答案 0 :(得分:1)

静态构造函数在第一次创建类的实例或引用静态成员时调用。因此,第一次创建Test实例或引用ClassInstance属性时,将调用静态构造函数。

您想了解更多吗? - http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx

答案 1 :(得分:1)

在访问任何静态成员或创建实例时调用静态构造函数

class Program
{
    static void Main(string[] args)
    {
        A.SomeField = new B();
    }
}

class A
{
    static A()
    {
        Console.WriteLine("Static A");
    }

    public static B SomeField { get; set; }
}

class B
{
    static B()
    {
        Console.WriteLine("Static B");
    }
}

结果:

Static B
Static A

如您所见 - 结果中没有“静态B”

答案 2 :(得分:1)

我验证了相同的行为,但是如果您更改这样的代码:

class AnotherClass {}

class Test
{
    static Test()
    {
        Console.WriteLine("Hello, world!");
    }

    public static AnotherClass ClassInstance { get { return new AnotherClass(); } }

}

class Program
{
    public static void Main()
    {
        var x = Test.ClassInstance;
    }
}

它写道“你好,世界!”......

答案 3 :(得分:0)

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数。

来自Msdn.

的更多信息