C#基础语法:结构和类区别详解
结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用。
下面总结一下结构和类的不同:
1.结构是值类型,对结构类型的变量赋值将创建所赋值的一个副本。
2.结构实例的默认值不是null,而是具有默认值的初始值。
3.在结构和类中this的意义不一样。
4.结构不支持继承(所以结构成员的声明可访问性不能是protected,protectedinternal,结构中的函数成员不能是abstract或者virtual,所以在结构中override修饰符只适用于重写从System.ValueType继承的方法)但是可以实现接口。
5.在结构中实例字段声明中不能含有变量的初始值设定项
6.在结构中不能声明无参数的实例构造函数。
7.在结构中不能声明析构函数。
测试区别特性代码:
usingSystem; namespaceStructAndClass { structSPoint { publicintx,y; publicSPoint(intx,inty) { this.x=x; this.y=y; } } classCPoint { publicintx,y; publicCPoint(intx,inty) { this.x=x; this.y=y; } } classTest { publicstaticvoidMain() { SPointsp1=newSPoint(2,5); Console.WriteLine("结构/sp1初始值:"); Console.WriteLine("sp1.x={0}",sp1.x); SPointsp2=sp1; Console.WriteLine("sp1=sp2后:"); Console.WriteLine("sp1.x={0}"); Console.WriteLine("sp1.x={0}",sp1.x); Console.WriteLine("sp2.x={0}",sp2.x); sp1.x=5; Console.WriteLine("再次改变sp1的值后:"); Console.WriteLine("sp1.x={0}",sp1.x); Console.WriteLine("sp2.x={0}",sp2.x); Console.WriteLine("============================"); CPointcp1=newCPoint(2,5); Console.WriteLine("类/cp1初始值:"); Console.WriteLine("cp1.x={0}",cp1.x); CPointcp2=cp1; Console.WriteLine("cp1=cp2后:"); Console.WriteLine("cp1.x={0}",cp1.x); Console.WriteLine("cp2.x={0}",cp2.x); cp1.x=5; Console.WriteLine("再次改变cp1的值后:"); Console.WriteLine("cp1.x={0}",cp1.x); Console.WriteLine("cp2.x={0}",cp2.x); Console.ReadKey(); } } }
对于结构,即使没有new运算符声明的结构变量也是有效的,结构虽然不能声明无参数的实力构造函数,但是它其实隐式的包含了一个无参数的构造函数:而且在结构的所有字段没有明确赋值之前,不能调用结构的实例函数成员。在结构的构造函数中应该给所有的字段赋值。例如:
structDC { publicintx,y; publicintX { set { x=value; } get { returnx; } } publicintY { set { y=value; } get { returny; } } publicDC(intx,inty) { this.x=x; this.y=y; } } structRDC { publicintx,y; publicintX { set { x=value; } get { returnx; } } publicintY { set { y=value; } get { returny; } } publicRDC(intx,inty) { this.x=x; this.y=y; } } classTest { publicstaticvoidMain() { DCdc=newDC(); dc.x=3; dc.y=5; Console.WriteLine("已经对x,y初始化后:"); Console.WriteLine("此时可以访问和修改dc.X={0}的值",dc.X); Console.WriteLine("我在这里创建了一个DC的复制结构RDC/n并且不对x,y初始化就会报错"); RDCrdc; rdc.y=5;//可以编译通过 rdc.X=3;//这里就会出错,不能编译通过 Console.WriteLine("=======testover================"); } }
在结构的实例构造函数内,this相当于一个结构类型的out参数,(必须在内部对它明确赋值)而在结构的实例函数成员内,this相当于一个结构类型的ref参数。在这两种情况下,this本身相当于一个变量,因而有可能对该函数成员调用所涉及的整个结构进行修改(如对this赋值,或者将this作为ref或out参数传递)。例如:(引用上面的例子)
structDC { publicintx,y; publicintX { set { x=value; } get { returnx; } } publicintY { set { y=value; } get { returny; } } publicDC(intx,inty) { X=x;//这里就是错的 Y=y;//会提示没有给this对象的所有字段赋值 } }