C#的静态构造函数的实时示例

时间:2013-09-02 06:48:35

标签: c#

我知道静态构造函数的概念。

  

静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前会自动调用它。

我想知道为什么类只包含单个静态构造函数?静态构造函数的实时场景是什么?

它与私有构造函数有何不同?我搜索了很多链接,但我无法理解。

http://social.msdn.microsoft.com/Forums/en-US/a9f8dcca-32d1-4a2b-b3fe-7d8f34f3b3f1/c-programmingstatic-constructor

Private vs Static constructors in .Net

2 个答案:

答案 0 :(得分:2)

  

我想知道为什么类只包含单个静态构造函数?

因为它是自动调用的,所以无法将任何参数传递给该构造函数。这就是为什么只有一个无参数静态构造函数是可能的。

  

静态构造函数的实时场景是什么?

您应该将它用于在使用课程之前必须完成的任何工作,并且必须只进行一次。

  

它与私有构造函数的区别?

正在运行私有构造函数,以便它运行。静态构造函数在第一次使用class之前由CLR运行,您可以确定它何时发生。

静态构造函数用法的实际代码示例 - 它创建一个表达式树并编译它以便以后使用,并且每次调用TestFunction时执行安全的表达式树编译:< / p>

class Test<T> where T : struct, IConvertible
{
    private static Func<int, T> _getInt;

    static Test()
    {
        var param = Expression.Parameter(typeof(int), "x");
        UnaryExpression body = Expression.Convert(param, typeof(T));
        _getInt = Expression.Lambda<Func<int, T>>(body, param).Compile();
    }

    public static T TestFunction(T x)
    {
        int n = Convert.ToInt32(x);
        T result = _getInt(n);
        return result;
    }
}

来自Convert class, IConvertible interface and Generics performance comparison测试的代码

答案 1 :(得分:0)

如果你想比较静态构造函数和实例构造函数,你可以用这种方式来思考它。

实例构造函数用于实例化特定类的新实例(无论是公共的,私有的还是受保护的)。

静态构造函数用于“初始化”整个类型。这就是在创建第一个实例或引用任何静态成员之前自动调用静态构造函数的原因。从语义上讲,它只是类型初始化代码片段而不是构造函数(或者您可以将其视为类型构造函数)。

私有构造函数只是具有私有访问可见性的实例构造函数(因此您可以使用它来在声明它的同一个类中实例化新实例)。