C# - 每次初始化类时都会初始化类的静态属性吗?

Joh*_*n C 2 c# static

我目前正在查看一些旧代码,我遇到了一个使用私有静态属性的类,该属性使用默认值创建并且从未修改;像这样的——

public class Foo
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["SqlConnection"].ToString();

    public Bar GetBar(int barId)
    {
        // get bar using "ConnectionString" above
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 -ConnectionString保持静态有什么好处吗?即ConfigurationManager.ConnectionStrings["SqlConnection"].ToString();每次运行时new Foo()都运行从而使属性的静态值变得多余,因为它在每次类初始化时都会被覆盖?

Zor*_*vat 6

静态字段在实例化该类的第一个对象时初始化一次,而不是每次创建对象时。这使得它们相对高效。

然而,这样做有一个缺点,那就是实例级构造函数装饰有一个状态机,用于确定一次性初始化是否已完成。

当创建类的第一个对象时,静态构造函数将在任何其他代码在实例级别执行之前被调用。对于后续的实例化,这一步将被跳过,因为该类已经被初始化。

这个额外的代码是在编译期间生成的,它使每个实例级构造函数比没有静态成员时慢一点。

  • 如果 OP 不理解 `static`,那么我认为将 `ThreadStatic` 带入讨论不会有帮助 @RahulAgarwal 。 (2认同)