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
相关产品推荐
相关产品推荐

