zoukankan      html  css  js  c++  java
  • C# 之 静态字段初始化

          当一个字段声明中含有 static 修饰符时,由该声明引入的字段为静态字段(静态变量)。当不存在 static 修饰符时,由该声明引入的字段为实例字段(实例变量)。
          静态字段不属于某个特定的实例;相反,它只标识了一个存储位置。不管创建了多少个类实例,对于关联的应用程序域来说,在任何时候静态字段都只会有一个副本。实例字段属于某个实例。具体说来,类的每个实例都包含了该类的所有实例字段的一个单独的集合。
    (2)字段声明可以包含变量初始值设定项,两者初始化区别如下:
      对于静态字段,变量初始值设定项相当于在类初始化期间执行的赋值语句。
      对于实例字段,变量初始值设定项相当于创建类的实例时执行的赋值语句。
    示例如下:
    using System;
    class Test
    {
       static double x = Math.Sqrt(2.0);
       int i = 100;
       string s = "Hello";
       static void Main() {
          Test a = new Test();
          Console.WriteLine("x = {0}, i = {1}, s = {2}", x, a.i, a.s);
       }
    }

    产生输出:

    x = 1.4142135623731, i = 100, s = Hello

    这是因为对 x 的赋值发生在静态字段初始值设定项执行时,而对 is 的赋值发生在实例字段初始值设定项执行时。

    (3)类的静态字段变量初始值设定项对应于一个赋值序列,这些赋值按照它们在相关的类声明中出现的文本顺序执行。如果类中存在静态构造函数,则静态字段初始值设定项的执行在该静态构造函数即将执行前发生。否则,静态字段初始值设定项在第一次使用该类的静态字段之前先被执行,但实际执行时间依赖于具体的实现。

    如下示例:

    using System;
    class Test
    {
       static void Main() {
          Console.WriteLine("{0} {1}", B.Y, A.X);
       }
       public static int F(string s) {
          Console.WriteLine(s);
          return 1;
       }
    }
    class A
    {
       public static int X = Test.F("Init A");
    }
    class B
    {
       public static int Y = Test.F("Init B");
    }

    或产生输出

    Init B
    Init A
    1 1

    这是因为 X 的初始值设定项和 Y 的初始值设定项的执行顺序无法预先确定,上述两种顺序都有可能发生;唯一能够确定的是:它们一定会在对那些字段的引用之前发生。但是,下面的示例:

    using System;
    class Test
    {
       static void Main() {
          Console.WriteLine("{0} {1}", B.Y, A.X);
       }
       public static int F(string s) {
          Console.WriteLine(s);
          return 1;
       }
    }
    class A
    {
       static A() {}
       public static int X = Test.F("Init A");
    }
    class B
    {
       static B() {}
       public static int Y = Test.F("Init B");
    }

    所产生的输出必然是:

    Init B
    Init A
    1 1

    这是因为关于何时执行静态构造函数的规则(在第 10.11 节中定义)规定:B 的静态构造函数(以及 B 的静态字段初始值设定项)必须在 A 的静态构造函数和字段初始值设定项之前运行。

  • 相关阅读:
    【转载】分析商品日均销量(DMS)对促销商品选择的意义
    日志备份和差异备份还原中的常见问题示例(转自&邹建)
    SQL Server 2000中的完整备份、差异备份操作
    数据库差异备份与增量备份的不同之处
    差异备份和还原操作方法(转)
    SQL备份(全)
    Microsoft SQL2000 错误代码 (@@error)
    图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别
    arm-none-linux-gnueabi-gcc command not found
    关于ST-Link的internal command error问题的解决方法
  • 原文地址:https://www.cnblogs.com/xinaixia/p/4554280.html
Copyright © 2011-2022 走看看