类中的静态和普通构造函数

时间:2014-08-01 20:18:30

标签: c# .net

假设我们在类中有静态构造函数,普通构造函数和静态方法。

Main()中我们的代码为:

Classname.staticmethod();

在这种情况下,在执行静态方法之前,哪个构造函数被称为1st?: - 静态构造函数或普通构造函数?

5 个答案:

答案 0 :(得分:5)

Why don't you try it ?

class Foo 
{

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

    public Foo() { Console.WriteLine("The constructor is called."); }

    public static void Bar() { Console.WriteLine("The static Bar method is called."); }
}

public static void Main()
{
    Foo.Bar();
}

输出结果为:

// Static constructor is called.
// The static Bar method is called.

MSDN说的是静态构造函数:

  

在创建第一个实例之前自动调用它,或引用任何静态成员

未调用实例构造函数,因为您没有创建实例。

有关构造函数have a look at this question的执行顺序的更多信息。

答案 1 :(得分:1)

将始终调用静态构造函数 - 无论是调用静态方法还是创建实例。

假设有一个默认的实例构造函数,它将在调用new Classname();

时调用

答案 2 :(得分:1)

静态构造函数仅自动调用一次。它将在执行静态方法后立即调用,或者创建实例。以先到者为准。

因此,在这种情况下,会立即调用静态构造函数,因为您调用了静态方法。 您可以将其视为创建静态类的实例

答案 3 :(得分:1)

来自Static Constructors (C# Programming Guide)

  

静态构造函数具有以下属性:

     

•静止   构造函数不接受访问修饰符或具有参数。

     

•自动调用静态构造函数来初始化类   在创建第一个实例之前或任何静态成员之前   引用。

     

•无法直接调用静态构造函数。

     

•用户无法控制何时执行静态构造函数   在该计划中。

     

•静态构造函数的典型用法是当类使用a时   日志文件和构造函数用于将条目写入此文件。

     

•创建包装类时,静态构造函数也很有用   对于非托管代码,当构造函数可以调用LoadLibrary时   方法

     

•如果静态构造函数抛出异常,则运行时不会   再次调用它,类型将保持未初始化状态   程序所在的应用程序域的生命周期   运行

这是我写的一个快速示例,用于演示会发生什么:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Classname.staticmethod();

            Classname name = new Classname();
            Console.ReadLine();
        }
    }
    public class Classname
    {
        public static void staticmethod()
        {
            Console.WriteLine("staticmethod called");
        }

        static Classname()
        {
            Console.WriteLine("Static Constructor called");
        }

        public Classname()
        {
            Console.WriteLine("Instance Constructor called");
        }
    }
}

输出:

  

名为

的静态构造函数      

staticmethod调用

     

实例构造函数名为

答案 4 :(得分:0)

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