字段初始值无法引用非静态字段、方法或属性
刚学习C#时,在类内定义变量时,经常会出现标题内容的问题,即字段初始值无法引用非静态字段、方法或属性。这是为什么呢?
下面我们拿一个小程序来举例子。关于的ArrayList 实例t的3种不同的生成方法。
class collection
{
/// <summary>
///ArrayList 可以动态地添加和删除元素,可以将ArrayList类看做是扩充了功能的数组,但它不同于数组。
///ArrayList与数组的区别。
///数组的容量是固定的,而ArrayList的容量可以根据需要自动扩充。
///ArrayList提供添加,删除和插入某一范围元素的方法,但在数组中,只能依次获取或设置一个元素的值。
///ArrayList提供将只读和固定大小的包装返回集合的方法,而数组不提供。
///ArrayList只是一维的形式,而数组可以是多维的。
/// </summary>
ArrayList arraylist = new ArrayList();
ArrayList arraytest1 = new ArrayList(4);//4 means capacity
string[] test = new string[] { "0","1","2"};
ArrayList arraytest2 = new ArrayList(test);
}
对于第三种方法,即
string[] test = new string[] { "0","1","2"};
ArrayList arraytest2 = new ArrayList(test);
此时就会提示标题内容的错误。
这是因为在C#中,规定在类内部只能定义属性或者变量,并初始化,不能直接变量引用变量。
如例,在类collection中,定义了一个string 类型变量 test,而在定义ArrayList 类型变量 arraytest2时,引用了test。
这是因为c#中变量的初始化优先于构造函数。
string testA="world";
string testB="Hello "+testA;
这里在生成testB对象时,由于testA要调用string 类的构造函数,而变量的初始化优先于构造函数,所以会报错。
而若声明为静态变量则可以,是因为C#对象生成的顺序是先静态化后实例化。当一个类被访问时,静态变量和静态构造函数最先被初始化,
接着是对象的实例化和构造函数执行。