【问题标题】:Real time example for static constructor for C#C# 静态构造函数的实时示例
【发布时间】:2013-09-02 06:48:34
【问题描述】:

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

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

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

它与私有构造函数有何不同?我用谷歌搜索了很多链接,但我无法得到好主意。

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

Private vs Static constructors in .Net

【问题讨论】:

  • 不要对这个问题投反对票。 不幸的是,Stakcoverflow 正在研究逆向心理学 :)

标签: c#


【解决方案1】:

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

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

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

您应该将它用于在上课之前必须完成的任何工作,并且只需要完成一次。

它与私有构造函数有何不同?

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

静态构造函数使用的真实代码示例 - 它创建一个表达式树并编译它以供以后使用,并且每次调用 TestFunction 时都可以安全地执行表达式树编译:

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 测试的代码

【讨论】:

  • @Marchin 感谢您的解决方案。私有构造函数通常用于避免为类创建实例。但您的反馈是“每次初始化新类/结构实例时都会运行私有构造函数”。
  • @SivaRajini 当然!我修正了我的答案
【解决方案2】:

如果你想比较静态构造函数和实例构造函数,你可以这样考虑。

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

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

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

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2014-09-16
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2015-08-06
    • 2011-10-07
    相关资源
    最近更新 更多