结构struct注意项
结构Struct相对于类Class是一种轻量级的数据结构,在一般的编程中适当的采用 结构 会收到提高程序执行效率以及增强代码健壮性的效果。
以下总结一下平时使用结构需要注意的事项:
1:结构中不能声明不带参数的构造函数;
using System; class Test111 { struct TestStruct { TestStruct()
{
}
}
public static void Main(string[] args) { TestStruct _s=new TestStruct(); //TestStruct _s1=new TestStruct(); //TestStruct.a=10; Console.WriteLine("结束{0}",_s.ToString()); } }
如上代码编译就会报错“结构不能包含显式的无参数构造函数”。
2:结构中的实例字段不能直接初始化;
using System; class Test111 { struct TestStruct { int a=0;//实例字段a,此处在编译时会报错,可以像下面的方式声明即可,结构中默认的构造函数会对这些实例变量进行初始化,这一动作是默认进行的。
//int a;
}
public static void Main(string[] args) { TestStruct _s=new TestStruct(); Console.WriteLine("结束{0}",_s.ToString()); } }
以上代码编译会报错“结构中不能有实例字段初始值设定项”。
3:如果结构中有带参数的构造函数,则这一构造函数需要对结构中的所有实例字段进行初始化;
class Test111 { struct TestStruct { int a;//实例字段a public TestStruct(int a1) { //this.a=a1; } } public static void Main(string[] args) { TestStruct _s=new TestStruct(); Console.WriteLine("结束{0}",_s.ToString()); } }
以上代码编译会报错“在控制返回到调用方法之前,字段“Test111.TestStruct.a”必须完全赋值”。
4:结构中只可以重写System.ValueType类中的方法;
using System; class Test111 { struct TestStruct { int a;//实例字段a public TestStruct(int a1) { this.a=a1; } //结构隐式继承System.ValueType,且不可以从其他类继承,故只可以重写System.ValueType中的方法 public override string ToString() { return a.ToString(); } } public static void Main(string[] args) { TestStruct _s=new TestStruct(); Console.WriteLine("结束{0}",_s.ToString()); } }
5:当结构中不包含实例字段时可以不使用 new 关键字进行结构的初始化;否则必须使用 new 来初始化。
using System; class Test111 { struct TestStruct { public int Fun(int arg1,int arg2) { return arg1+arg2; } } public static void Main(string[] args) { TestStruct _s;//没有使用new关键字 Console.WriteLine("结束{0}",_s.Fun(1,2)); } }
6:声明一个结构时不可以用sealed、static、abstract来修饰,因为结构本身是不支持继承和被继承的(可以实现接口的定义),且结构中成员不可以使用protected以及preotected internal来修饰;结构中成员也不可以使用abstract以及virtual这些修饰词。
7:不能 TestStruct _s = null 实例化一个结构对象。