我目前正在查看一些旧代码,并且我遇到了一个使用私有静态属性的类,该属性是使用默认值创建的,并且从未修改过;像这样的东西 -
public class Foo
{
private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["SqlConnection"].ToString();
public Bar GetBar(int barId)
{
// get bar using "ConnectionString" above
}
}
所以我的问题是 - ConnectionString
静态有什么好处吗?即每次运行ConfigurationManager.ConnectionStrings["SqlConnection"].ToString();
时new Foo()
是否运行,从而使每次初始化类时覆盖属性的静态值是多余的?
答案 0 :(得分:3)
静态字段在实例化该类的第一个对象时初始化一次,而不是每次创建对象时。这使他们相对有效。
然而,这有一个缺点,那就是实例级构造函数用一个状态机装饰,它确定一次性初始化是否已经完成。
当创建类的第一个对象时,将在实例级别上执行任何其他代码之前调用静态构造函数。对于后续实例化,将跳过此步骤,因为该类已经初始化。
这个在编译过程中生成的附加代码使得每个实例级构造函数都比没有静态成员时要慢一些。
答案 1 :(得分:3)
不,static members仅在程序中第一次引用类之前初始化一次,并且在应用程序域的生命周期内保留在内存中。
但在这种情况下,该字段是多余的,因为ConfigurationManager
无论如何都会缓存此值,因此每次访问时都不会从配置文件中读取它。