C# 构造函数问题

来源:百度知道 编辑:UC知道 时间:2024/05/03 10:10:08
如果没有为类提供构造函数,系统就会默认给一个,该构造函数主要用来初始化类的字段,如果有为该类提供自己的构造函数,就不会执行系统默认的构造函数

那么如果我提供的构造函数什么都不做
public A
{
public string name;
public A(){ }
}
这样实例A对象的时候name被初始为null了,那就是说他还是执行了系统提供的默认的构造函数了?
默认的构造函数是把所有成员字段初始化成标准的默认值,如果我提供的构造函数什么都不做,那怎么初始那些成员字段,就像上面那个,name被初始成了null,怎么会说没有被初始化,如果没有被初始化,你访问name的话不就提示使用了未赋值的字段了吗

string s;
Console.Write(s);
请问这个不会出错?s有被初始化吗

我的意思是 书上说:默认的构造函数是把所有成员字段初始化成标准的默认值
name不是成员字段吗?如果我提供一个什么都不做的构造函数,实例A时他是怎么初始化name的

如果null不是初始化,那string name = null;Console.Write(name);可以编译通过
而string name;Console.Write(name);不可以通过

- -!看不懂!我提另个问题,定义变量通常由我们去赋值,如果我们不显示的给值他,他就会默认得到一个标准值,比如类或结构的字段(数字型是0,布尔型是false,引用型是空),那他默认的值是由谁,怎么样给予的?

简单的说就是所有成员都会在构造函数被强制初始化成默认值,这是类型安全保证的,默认值:http://msdn.microsoft.com/zh-cn/library/83fhsxwc(VS.80).aspx

你的A类不是继承了Object类,在Object就把所有成员初始化了:
1.这是默认构造函数的CLR反汇编A的构造函数
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method a::.ctor
2.这是用空构造函数替代的反汇编
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 10 (0xa)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: nop
IL_0009: ret
} // end of method a::.ctor