【问题标题】:Static Field Initializers [duplicate]静态字段初始化器 [重复]
【发布时间】:2014-07-21 19:05:07
【问题描述】:

我被困在我的代码与静态代码初始化器的实现之间。现在,我在这里分别调用 Main 中 A 类和 B 类的静态字段“x”。理想情况下,它应该生成如下输出:

A : 0
A.x : 5
B : 0
B.x : 5  

但是,它生成的输出为:

A : 0
B : 0
A.x : 5
B.x : 5  

请解释一下。

Code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class A
    {
        public static A _A = new A();
        public static int x = 5;
        public A()
        {
            Console.WriteLine("A : " + x);
        }
    }

    public class B
    {
        public static B _B = new B();
        public static int x = 5;
        public B()
        {
            Console.WriteLine("B : " + x);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("A.x : " + A.x);
            Console.WriteLine("B.x : " + B.x);
            Console.ReadKey();
        }
    }
}

【问题讨论】:

  • 由于AB 没有声明静态构造函数,它们的字段初始化器在第一次使用每个类的静态字段之前在依赖于实现的时间执行。在这种情况下,CLR 选择在 Main 的开头执行两个字段初始值设定项。
  • 要获得您期望的行为,请将空的静态构造函数添加到 ABstatic A() { }static B() { })。
  • @Micahel Liu 我在 Main Method 中注释掉了两个 Writeline 函数,但是没有生成输出。理想情况下,我期望输出为 A:0 和 B:0(根据你的回答) .
  • 如果您注释掉对 WriteLine 的调用,那么“第一次使用”永远不会发生,因此 CLR 可能会选择根本不执行字段初始化程序。尝试添加空的静态构造函数。
  • @MichaelLiu 添加空的静态构造函数工作......谢谢男人

标签: c# static


【解决方案1】:

字段的静态初始化以不确定的顺序发生,尝试将AB的构造函数设为静态,并初始化里面的变量。确保在第一次使用您的类时按照您指定的顺序对其进行初始化。

【讨论】:

  • try making your constructors static,什么?
  • 声明AB静态的构造函数。第一次使用该类时会调用静态构造函数。
【解决方案2】:

CLR 首先分析 main 中的代码:

这里使用了 2 个静态类,因此将按照它们的使用顺序解析它们的构造函数。

因此先执行构造函数中的 Writeline,然后执行主代码的 WriteLine。

如果你在 main 中先为 B 使用 Console.WriteLine,然后是 A,那么 B 的构造函数将首先执行。

【讨论】:

    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 2014-10-03
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多