注意:在C和C++中,未经初始化的变量是不能使用的。在C#中,系统将为每个未经初始化的变量提供一个默认值。这虽然中某种程序中保证了程序的安全性,但对本应初始化为某个特殊值的变量忘记了初始化,也常常会导致程序的执行误入岐途。
对于静态变量、非静态的对象变量和数组变量,这些变量自动初始化为本身的默认值。对于所有引用类型的变量,默认值为null。所有值类型的变量的默认值见下表所示:
表12-1 部分类型的域初始化的值
变量类型 | 默认值 |
sbyte,byte,short,ushort,int,uint,long,ulong | 0 |
char | \x0000 |
float | 0.0f |
double | 0.0d |
decimal | 0.0m |
bool | false |
enum | 0 |
对于struct类型的变量,默认的初始化将对构成该结构的每一个值类型初始化为上表中的默认值,对构成其的每一个引用类型初始化为null。
如果在类中,没有显式地对域进行初始化,系统将赋予其一个默认值。域的默认初始化分为两种情况:对于静态域,类在装载时对其进行初始化;对于非静态域,在类的实例创建时进行初始化。在默认的初始化之前,域的值是不可预测的。
比如,下面的代码是合法的:
class Test
{
static int a=b+1;
static int b=a+1;
}
实际上等价于:
a=1,b=2
而下面的代码则是非法的:
class A
{
int x=1;
int y=x+1;
}
因为非静态变量x在类A实例化以前并没有初始化,代码y=x+1无法得到正确的x的值。
时间: 2024-08-01 17:55:16