Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在类中存储变量及其执行流?_C#_Class_Static - Fatal编程技术网

C# 如何在类中存储变量及其执行流?

C# 如何在类中存储变量及其执行流?,c#,class,static,C#,Class,Static,我不熟悉C#编程。 请帮帮我 我创建了一个类Tester: class Tester { public int a = 5; public int b = a; } 问题1:为什么我不能使用此变量a初始化变量b 问题2:如果我将变量更改为static,那么它可以正常工作。为什么会有区别 class Tester { public static int a = 5; public static int b = a; } 问题3:在前面的示例中,如果我交换变量序

我不熟悉C#编程。 请帮帮我

我创建了一个类
Tester

class Tester 
{
    public int a = 5;
    public int b = a;
}
问题1:为什么我不能使用此变量
a
初始化变量
b

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

class Tester
{
    public static int a = 5;
    public static int b = a;
}
问题3:在前面的示例中,如果我交换变量序列,那么它可以正常工作,因为
a
b
之后声明。它如何初始化
a

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

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

回答2:它可以很好地处理static,因为static是在其他变量之前初始化的,并且它们的引用没有改变


请让我知道它是否有用。

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

您可以为此使用构造函数

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


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

class Test {
   int a = b;
   int b;
   public Test() {
      b = 1;
   }
}
a
的值是多少?如果使用构造函数初始化对象规则,则
a
将为1。然而,如果语法正确,它在引擎盖下的工作方式将不是这样,
a
将是0。字段初始值设定项实现方式的一个副作用是,它们的代码在构造函数体中的代码之前被注入构造函数。当类继承具有构造函数的基类时,这个问题变得更加复杂

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

对于静态字段,规则是宽松的,没有此引用,CLR为类初始值设定项的执行顺序提供了良好的保证。然而,这并不能避免歧义,在本例中,猜测字段值是一个练习:

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

试试看,看你是否能理解结果。这是一个很好的定义。

阅读这篇文章,这篇文章是关于变量和实例变量的。我发现这是一个非常有用的答案:你的第一段是不正确的,C语言实际上提供了一个保证。语言规范第10.11.2节,“变量初始值设定项按照类声明中出现的文本顺序执行。”是的,您的信息对我很有用。非常感谢AnirudhSo,这意味着静态变量的初始化顺序和它们在代码中声明的相同,编译器不能在静态字段的情况下更改任何序列。但我认为这不是静态变量编译器的正确行为。
class Test {
    static int a = b + 1;
    static int b = a + 1;
}