值类型局部变量必须先初始化才能使用,值类型成员变量可以不初始化。
一直有个印象值类型是可以不初始化就能用的,今天写代码遇到的情况却是不初始化不行,于是好好研究了一番。
测试代码如下:
值类型的成员变量只要声明一下就可以用,为什么局部变量就不能在声明后直接用呢?
我想实际上任何类型都是必须经初始化后才能用的,不管是值类型还是引用类型。只是有的必须在你的代码中显式写明,而有些由编译系统代劳了。看似只经过声明而未初始化的成员变量,实际上也经过了初始化。 因为成员变量总是隶属于某种类型的,而这种类型必须初始化后才能用(静态值类型成员变量的情况也类似)。 当系统为初始化这种类型分配内存时,也就为类型的成员变量分配内存并赋予了初始值, 也就是说成员变量的初始化工作是在包含其的类型的初始化过程中完成的。 而作为方法内部声明的局部变量,可以看作不属于任何类型,在为其赋值之前没有其它机会将其初始化,当然就不能用了。
测试代码如下:
using System;
public class MyClass
{
// 成员变量
private int _memberVariable;
public MyClass()
{
}
public void Print()
{
// 值类型的成员变量可不经过初始化,直接使用缺省值。
Console.WriteLine( string.Format( "实例成员变量,Int类型的缺省值为: {0}", _memberVariable ));
// 局部变量必须赋值后才能使用。
int localVariableInitialized = 3;
Console.WriteLine( string.Format( "局部变量必须赋值后才能使用: {0}", localVariableInitialized ));
// 未赋值的局部变量不能使用,以下语句将报错。
// int localVariableNotinitialized;
// Console.WriteLine( string.Format( "{0}", localVariableNotinitialized ));
}
}
class DemoClass
{
[STAThread]
static void Main(string[] args)
{
MyClass mc = new MyClass();
mc.Print();
Console.ReadLine();
}
}
public class MyClass
{
// 成员变量
private int _memberVariable;
public MyClass()
{
}
public void Print()
{
// 值类型的成员变量可不经过初始化,直接使用缺省值。
Console.WriteLine( string.Format( "实例成员变量,Int类型的缺省值为: {0}", _memberVariable ));
// 局部变量必须赋值后才能使用。
int localVariableInitialized = 3;
Console.WriteLine( string.Format( "局部变量必须赋值后才能使用: {0}", localVariableInitialized ));
// 未赋值的局部变量不能使用,以下语句将报错。
// int localVariableNotinitialized;
// Console.WriteLine( string.Format( "{0}", localVariableNotinitialized ));
}
}
class DemoClass
{
[STAThread]
static void Main(string[] args)
{
MyClass mc = new MyClass();
mc.Print();
Console.ReadLine();
}
}
值类型的成员变量只要声明一下就可以用,为什么局部变量就不能在声明后直接用呢?
我想实际上任何类型都是必须经初始化后才能用的,不管是值类型还是引用类型。只是有的必须在你的代码中显式写明,而有些由编译系统代劳了。看似只经过声明而未初始化的成员变量,实际上也经过了初始化。 因为成员变量总是隶属于某种类型的,而这种类型必须初始化后才能用(静态值类型成员变量的情况也类似)。 当系统为初始化这种类型分配内存时,也就为类型的成员变量分配内存并赋予了初始值, 也就是说成员变量的初始化工作是在包含其的类型的初始化过程中完成的。 而作为方法内部声明的局部变量,可以看作不属于任何类型,在为其赋值之前没有其它机会将其初始化,当然就不能用了。