C# 我应该如何解释这个int初始化?

C# 我应该如何解释这个int初始化?,c#,C#,我已经为C#编程好几个月了,但直到现在我还没有遇到过这种情况;这个说明是什么意思 int a = 1, b; a和b是整数 a的值是1。b还没有值a和b是整数 a的值是1。b还没有值它与: int a = 1; int b; 这与: int a = 1; int b; 它定义了整数“a”和“b”,将值1赋给a它定义了整数“a”和“b”,将值1赋给a上述语句在单个语句中声明相同数据类型的多个变量 因此,声明多个变量的局部变量声明相当于具有相同类型的单个变量的多个声明 这意味着 int a=1

我已经为C#编程好几个月了,但直到现在我还没有遇到过这种情况;这个说明是什么意思

int a = 1, b;
a和b是整数

a的值是1。b还没有值

a和b是整数

a的值是1。b还没有值

它与:

int a = 1;
int b;
这与:

int a = 1;
int b;

它定义了整数“a”和“b”,将值1赋给a

它定义了整数“a”和“b”,将值1赋给a

上述语句在单个语句中声明相同数据类型的多个变量

因此,声明多个变量的局部变量声明相当于具有相同类型的单个变量的多个声明

这意味着

int a=1, b;
表示
a
b
都具有相同的数据类型,即
int
,我们使用值
1
初始化变量
a
b
具有默认int值,即
0

因此,您可以将其等效为

int a=1;
int b;

上述语句在单个语句中声明相同数据类型的多个变量

因此,声明多个变量的局部变量声明相当于具有相同类型的单个变量的多个声明

这意味着

int a=1, b;
表示
a
b
都具有相同的数据类型,即
int
,我们使用值
1
初始化变量
a
b
具有默认int值,即
0

因此,您可以将其等效为

int a=1;
int b;

这取决于它们是“局部变量”(方法变量)还是“字段”(实例变量)

对于字段,它将a和b声明为Int32;当在调用构造函数之前擦除内存(newobj/initobj)时,它们都初始化为零,然后在构造函数的开头为a赋值1


对于局部变量,它将a和b声明为Int32,并立即将1分配给a。B没有定义的值。“确定赋值”规则意味着它不需要定义值。然而,堆栈上的所有值都必须有一些值——我们可以通过欺骗获得该值(例如,在IL中编写一个实现“out”的方法,但只是取消引用地址)。实际值取决于是否设置了init locals标志。这不是c#语言功能,但当前编译器确实包含此标志。这意味着局部变量的内存空间在方法开始时被擦除(设置为零)。因此,逻辑值将为零,但原因不同。不需要这样做,所以这完全是一个实现细节。

这取决于这些是“局部变量”(方法变量)还是“字段”(实例变量)

对于字段,它将a和b声明为Int32;当在调用构造函数之前擦除内存(newobj/initobj)时,它们都初始化为零,然后在构造函数的开头为a赋值1


对于局部变量,它将a和b声明为Int32,并立即将1分配给a。B没有定义的值。“确定赋值”规则意味着它不需要定义值。然而,堆栈上的所有值都必须有一些值——我们可以通过欺骗获得该值(例如,在IL中编写一个实现“out”的方法,但只是取消引用地址)。实际值取决于是否设置了init locals标志。这不是c#语言功能,但当前编译器确实包含此标志。这意味着局部变量的内存空间在方法开始时被擦除(设置为零)。因此,逻辑值将为零,但原因不同。没有发生这种情况的要求-因此这完全是一个实现细节。

a声明并初始化为零,而b刚刚声明。

a声明并初始化为零,而b刚刚声明。

它只定义但不初始化
b
。你说得对,我这边的单词选择错误:)它只定义但不初始化
b
。没错,我这边的单词选择错误:)@Vlad,这取决于这些是字段还是局部变量。如果它们是局部变量,则没有定义的值。实际值取决于CLI实现。从语言的角度来看,没有必需的值。但是,如果你在封面下偷看的话,它通常会是零——但在我看来,这是因为“hasavalue0”具有误导性。@Vlad这取决于这些是字段还是本地字段。如果它们是局部变量,则没有定义的值。实际值取决于CLI实现。从语言的角度来看,没有必需的值。但如果你在封面下偷看的话,它通常是零——但由于某些原因,使得“hasavalue0”具有误导性,IMO.我们是否可以说b的值为零完全取决于它是字段还是局部变量。如果
b
是局部变量,那么它就没有值0,因为局部变量没有初始化为默认值。您甚至无法读取
b
的值,直到它被明确分配,因此
int b;控制台写入线(b)将无法编译。@Lee好吧,实际上我们可以找到值(通过欺骗-不能仅从c#中找到),而在MS.NET CLI上,该值恰好为零。但我们必须使用实现细节来实现这一点。仅在语言层面:事实上,它没有定义值我们是否可以说b的值为零完全取决于它是字段还是局部变量如果
b
是局部变量,那么它就没有值0,因为局部变量没有初始化为默认值。您甚至无法读取
b
的值,直到它被明确分配,因此
int b;控制台写入线(b)将无法编译。@Lee好吧,实际上我们可以找到值(通过欺骗-不能仅从c#中找到),而在MS.NET CL上,值将为零。”