【问题标题】:How variable stored in class and their flow of execution?变量如何存储在类中以及它们的执行流程?
【发布时间】:2013-10-14 09:27:09
【问题描述】:

我是 C# 编程的新手。 请帮帮我。

我创建了一个类Tester

class Tester 
{
    public int a = 5;
    public int b = a;
}

问题1:为什么我不能使用这个变量a来初始化变量b

问题 2:如果我将变量更改为静态,那么它工作正常。为什么会有区别?

class Tester
{
    public static int a = 5;
    public static int b = a;
}

问题 3:在前面的示例中,如果我交换变量序列,那么它可以正常工作,因为 ab 之后声明。怎么初始化a

class Tester
{
    public static int b = a; // 0
    public static int a = 5; // 5
}

【问题讨论】:

标签: c# class static


【解决方案1】:

当您使用字段初始化器时,会出现一些棘手的初始化顺序问题。一个简单的例子是:

class Test {
   int a = b;
   int b;
   public Test() {
      b = 1;
   }
}

a 的值是多少?如果您使用 constructor-initializes-object 规则,那么 a 将为 1。但这不是它在后台工作的方式,如果语法有效,a 将为 0。字段初始值设定项实现方式的副作用是,它们的代码在构造函数主体中的代码之前注入到构造函数中。当类继承具有构造函数的基类时,这个问题会变得更加复杂。

这太丑陋了,C#语言设计者通过简单地禁止这种代码来解决这个问题。规则是您不能在字段初始化器中引用 this,这将创建对其类构造函数尚未完成执行的对象的引用。

静态字段的规则放宽了,没有 this 引用,CLR 为类初始化程序的执行顺序提供了不错的保证。然而,这并不能避免歧义,这是一个猜测本示例中的字段值的练习:

class Test {
    static int a = b + 1;
    static int b = a + 1;
}

尝试一下,看看你是否能理解结果。否则它是明确定义的。

【讨论】:

    【解决方案2】:

    Answer1:您不能使用一个实例变量来初始化另一个实例变量。为什么?因为编译器可以重新排列这些 - 不能保证变量“a”会在“b”之前初始化,所以上面的行可能会抛出 NullReferenceException。

    Answer2:它适用于静态,因为静态在其他变量之前初始化并且它们的引用不会改变。

    如果有帮助请告诉我。

    【讨论】:

    • 是的,您的信息对我很有用。非常感谢阿尼鲁德
    • 也就是说静态变量的初始化顺序与代码中声明的顺序一致,编译器不能对静态字段进行任何顺序更改。但我不认为这是编译器使用静态变量的正确行为。
    【解决方案3】:

    正如阿尼鲁德所说。您不能使用实例变量来初始化另一个实例变量。为什么?因为编译器可以重新排列这些 - 不能保证 a 将在 b 之前初始化。

    您可以为此使用构造函数。

    class Tester
    {
       public int a=5;
       public int b;
       public Tester()//constructor
       {
          b=a;
       }
    }
    

    class Tester
    {
        public static int a = 5;
        public static int b;
        public Tester()//constructor
        {
            b = a;
        }
    }
    

    【讨论】:

    • 您的第一段不正确,C# 语言实际上提供了保证。语言规范中的第 10.11.2 节,“变量初始化程序按照它们在类声明中出现的文本顺序执行。”
    猜你喜欢
    • 2018-08-05
    • 2011-07-30
    • 2021-06-14
    • 1970-01-01
    • 2015-02-13
    • 2011-11-11
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多