C# 为什么有时我们需要初始化结构,而有时不需要?

C# 为什么有时我们需要初始化结构,而有时不需要?,c#,C#,假设我们有以下代码: struct Point { public Int32 m_x, m_y; } class Rectangle { Point p; } //Program.cs static void Main(string[] args) { Point p; int i = p.m_x // does't compile, unassigned field m_x } 因此,我们需要初始化结构: static void Main(string[] ar

假设我们有以下代码:

struct Point {
   public Int32 m_x, m_y;
}

class Rectangle {
   Point p;
}

//Program.cs
static void Main(string[] args) {
   Point p;
   int i = p.m_x  // does't compile, unassigned field m_x
}
因此,我们需要初始化结构:

static void Main(string[] args) {
   Point p;
   p.m_x = 0; 
   int i = p.m_x;  // compile OK now
}
或者我们可以使用所有struct的默认无参数构造函数来初始化其字段:

static void Main(string[] args) {
   Point p = new P();
   int i = p.m_x   //OK
}
看起来我们需要初始化结构,但如果结构是类中的字段,则不需要初始化:

static void Main(string[] args) {
   Rectangle r = new Rectangle();
   int i = r.p.m_x;    //   comile OK
}

它仍然可以编译,即使我没有初始化结构。我检查了IL代码,发现矩形的构造函数也不调用结构的无参数构造函数。

需要初始化局部变量:

在C#中,必须先初始化声明的变量,然后才能使用它。 因为结构类型变量不能为null(除非它是 变量),必须实例化实例 相应类型的

关于字段,让我们看看

15.5.5字段初始化

字段的初始值,无论是静态字段还是静态字段 实例字段,是默认值

10.3默认值

变量的默认值取决于变量的类型 并确定如下:

  • 对于值类型的变量,默认值与值类型的默认构造函数计算的值相同
9.3.3默认构造函数

所有值类型都隐式声明一个称为默认构造函数的公共无参数实例构造函数。默认构造函数 返回一个称为默认值的零初始化实例 值类型

  • 对于所有简单类型,默认值是全零位模式产生的值:

    • 对于sbyte、byte、short、ushort、int、uint、long和ulong,默认值为0
    • 对于char,默认值为“\x0000”
    • 对于float,默认值为0.0f
    • 对于double,默认值为0.0d
    • 对于十进制,默认值为0.0m
    • 对于bool,默认值为false
  • 对于枚举类型E,默认值为0,转换为类型E。 9类

  • 对于结构类型,默认值是通过将所有值类型字段设置为其默认值和所有引用而生成的值 将字段类型设置为空


“在C#中,必须先初始化声明的变量才能使用。由于结构类型变量不能为null(除非它是可为null值类型的变量),因此必须实例化相应类型的实例”-值类型的字段不需要初始化,但是,它们将是
default
@JohnG抱歉,我在处理我的代码,忘记注释了编译器可能省略了实际的默认初始值设定项,因为默认值(使用
localsinit
而不是实际的构造函数)是相同的。此外,
Rectangle
如何初始化与您(调用代码)无关,只是它会这样做,因此
new Rectangle()
保证有一个初始化字段。旁白:
Rectangle
是一个结构,而不是一个类,这并不重要。@Charlieface
Rectangle
是我生活中的一个类code@Charlieface:)@Charlieface你的意思是抑制localsinit标志的发射吗?我指的是实际的标志。改变了我的想法,看起来它实际上并不依赖于它,即使是在发行版中。