You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中显式构造函数未指定时默认值如何初始化?是否由隐式构造函数完成?

C#变量默认初始化的常见疑问解答

嘿,我来帮你把这两个关于C#变量初始化的问题讲明白,结合你提供的示例代码一起分析:

问题1:在C#中,即使显式构造函数未指定,变量的默认值是如何初始化的?

在C#的类中,所有成员字段(也就是你在类里声明的变量)会在构造函数执行之前,被CLR(公共语言运行时)自动初始化为对应类型的默认值。这个过程是强制执行的,和你有没有写显式构造函数无关:

  • 值类型(比如int、bool、struct)会被设为它们的默认值,像int就是0,bool是false;
  • 引用类型(比如string、自定义类)会被设为null。

拿你的示例来说,class A里的int i,在调用显式构造函数public A()之前,就已经被CLR初始化为0了,所以构造函数里没给它赋值也不影响,最终实例的i依然是0。

问题2:在显式构造函数中声明但未初始化的变量,其默认值是如何被初始化的?该初始化操作是否由隐式构造函数完成?

首先得明确:如果你说的是类的成员字段(比如示例里的int i),那规则和上面一致,但如果是构造函数里的局部变量,规则完全不同,我分开说:

针对类成员字段的情况:

  • 类字段的默认初始化不是由隐式构造函数完成的,而是CLR在创建类实例时的一个前置步骤——不管你有没有写显式构造函数,这个初始化都会发生。
  • 当你定义了显式构造函数(比如示例里的public A()),CLR依然会先把所有字段初始化为默认值,再执行你写的显式构造函数里的代码。所以哪怕你的显式构造函数里没给i赋值,它早已经被设为0了。

针对构造函数内的局部变量的情况:

如果是在构造函数里声明的局部变量(比如public A() { int j; Console.Write(j); }),C#编译器会直接报错——因为局部变量不会被自动初始化,必须手动赋值后才能使用,这和类字段的初始化规则是完全不同的,别搞混了。

再看你提供的示例代码:

class A { 
    int i; 
    public A() { } 
} 
class Program { 
    static void Main(string[] args) { 
        A a = new A(); 
        Console.Write(a.i); 
    } 
}

输出结果是0,核心原因就是i在显式构造函数执行前,已经被CLR自动初始化为int的默认值0了,构造函数里没有修改它,所以最终输出0。

内容的提问来源于stack exchange,提问作者karthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:57:49