【问题标题】:static variables initialization静态变量初始化
【发布时间】:2011-08-22 10:27:22
【问题描述】:

今天我和我的同事讨论并总结了以下几点。如果一切正确或需要进行一些修改,请提供一些说明。

  1. 当类中未定义静态构造函数时,静态字段会在使用前进行初始化。
  2. 在类中定义静态构造函数时,静态字段会在它们使用之前或作为实例创建(之前)的一部分进行初始化。
  3. 如果在静态方法中没有访问静态字段并且调用该静态方法。只有在该类中定义了静态构造函数时,才会初始化静态字段。
  4. 如果可能,应在类中避免使用静态构造函数。

【问题讨论】:

  • “静态变量”是什么意思,属性?领域?您不能将方法中的变量声明为静态变量。
  • 是的,在 C# 中,静态变量不在方法中声明。静态变量是指字段。我已经更新了问题。
  • #4 - 不,不要避免使用静态构造函数。它是初始化类型的一次性成本。与往常一样,在避免使用任何功能之前,请以您方便的方式使用它。然后测试看看这是否对性能有任何负面影响。 [它不会,除非你在构造函数中做一些昂贵的事情,在这种情况下,它是你的代码,而不是构造的事实。]
  • #1-#3 几乎肯定是错误的。 AFAIK,一个 absent 静态构造函数等同于一个 empty 静态构造函数。其他任何事情都会变得混乱。最接近准确的是#2,但是没有 "当定义静态构造函数时",并且 first(实例创建)。

标签: c# static initialization


【解决方案1】:

1.-3.您无法确切知道它何时发生,因此您不能依赖它。静态构造函数可以让您稍微控制调用它时会发生什么。

public class UtilityClass
{
  //
  // Resources
  //

  // r1 will be initialized by the static constructor
  static Resource1 r1 = null;

  // r2 will be initialized first, as static constructors are 
  // invoked after the static variables are initialized
  static Resource2 r2 = new Resource2();

  static UtilityClass()
  {
    r1 = new Resource1();
  }

  static void f1(){}
  static void f2(){}
}

4.静态构造函数很慢

静态构造函数执行的确切时间取决于实现,但受以下规则的约束:

  • 类的静态构造函数 在任何实例之前执行 类已创建。
  • 类的静态构造函数 在任何静态之前执行 班级成员是
    参考。
  • 类的静态构造函数 在类的静态字段初始化程序(如果有)之后执行。
  • 类的静态构造函数 最多执行一次 单个程序实例化。
  • 两个之间的执行顺序 两个的静态构造函数
    未指定不同的类。

【讨论】:

  • 但必须有一些关于这些的描述。并想知道这些点是否合乎逻辑以及 CLR 的工作原理?
  • -1 当然你知道什么时候调用静态ctor。即当创建类的第一个实例或第一次访问任何静态成员(方法、字段)时。
  • “静态构造函数很慢” - 这是一个模糊且有些不合理的说法。静态构造函数比在单个静态字段上声明的等效初始化程序慢的方式是什么?鉴于它只被调用一次,恕我直言,它需要比实例初始化慢 100 倍才能被称为“慢”。
  • 补充一下 Christian 所说的,在确保静态构造函数已运行的罕见情况下,只需访问任何静态成员即可。
【解决方案2】:

你所有的观点都是正确的。

应该避免使用静态构造函数的原因是,编译器会在调用类的任何方法的任何地方注入代码,以检查是否调用了静态构造函数。这会对性能产生负面影响。

您可以做的是在您的类中有一个私有静态字段,当调用默认(或其他非静态)构造函数时,该字段被分配一个虚拟值。这会在对象创建时初始化所有静态字段。

【讨论】:

  • 错误,没有。重新“编译器在调用类的任何方法的任何地方注入代码,以检查是否调用了静态构造函数。”你有这个乱码。唯一完成的注入是在 static 成员上,以确保静态初始化程序首先运行。 AFAIK 检查并不比测试空值差。我从未遇到过这种情况会对性能产生重要影响。绝大多数成员访问是 instance 而不是 static
猜你喜欢
  • 2010-12-22
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多