gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:31:52 24 4
gpt4 key购买 nike

我是 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:在前面的示例中,如果我交换变量的序列那么它工作正常为什么因为 ab 之后声明。它如何初始化a

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

最佳答案

当您使用字段初始值设定项时,会出现一些令人讨厌的初始化顺序问题。一个简单的例子是:

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

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

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

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

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

尝试一下,看看您是否能理解结果。它在其他方面是明确定义的。

关于c# - 变量如何存储在类中及其执行流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19357158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com