标签:class 教程 图解 一个 blog 第十章 编译 分享 nal
结构是程序员定义的数据类型,与类非常相似。它们有数据成员和函数成员。结构与类的重要区别是:
声明结构的语法与声明类相似
关键字 ↓ struct SturctName { MemberDeclarations }
例:Point结构
struct Point { public int X; public int Y; } class Program { static void Main() { Point first,second,third; first.X=10;first.Y=10; second.X=20;second.Y=20; third.X=first.X+second.X; third.Y=first.Y+second.Y; Console.WriteLine("first: {0},{1}",first.X,first.Y); Console.WriteLine("second: {0},{1}",second.X,second.Y); Console.WriteLine("third: {0},{1}",third.X,third.Y); } }
和所有值类型一样,结构类型变量含有自己的数据。因此:
例:结构变量的内存安排
class CSimple { public int X; public int Y; } struct Simple { public int X; public int Y; } class Program { static void Main() { var cs=new CSimple(); var ss=new Simple(); ... } }
把一个结构赋值给另一个结构,就将一个结构的值复制给另一个结构。这和复制类变量不同,复制类变量时只复制引用。
例:结构变量赋值与类变量赋值的区别
class CSimple { public int X; public int Y; } struct Simple { public int X; public int Y; } class Program { static void Main() { CSimple cs1=new CSimple(),cs2=null; Simple ss1=new Simple(),ss2=new Simple(); cs1.X=ss1.X=5; cs1.Y=ss1.Y=10; cs2=cs1; ss2=ss1; } }
结构可以有实例构造函数和静态构造函数,但不允许有析构函数。
语言隐式地为每个结构提供一个无参构造函数。这个构造函数把结构的每个成员设置为该类型的默认值。值成员设置成它们的默认值,引用成员设置为null。
例:带参数的构造函数
struct Simple { public int X; public int Y; public Simple(int a,int b) { X=a; Y=b; } } class Program { static void Main() { var s1=new Simple(); var s2=new Simple(4,10); Console.WriteLine("{0},{1}",s1.X,s1.Y); Console.WriteLine("{0},{1}",s2.X,s2.Y); } }
也可以不是用new运算符创建结构实例,然而这样做,有一些限制:
例:不用new创建结构实例
struct Simple { public int X; public int Y; } class Program { static void Main() { Simple s1,s2; Console.WriteLine("{0},{1}",s1.X,s1.Y); //编译错误 ↑ ↑ 还未赋值 s2.X=5; s2.Y=10; Console.WriteLine("{0},{1}",s2.X,s2.Y); //没错误 } }
与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。
以下两种行为发生前,会调用静态构造函数
在结构中字段初始化语句是不允许的。
struct Simple { public int x=10; //编译错误 public int y=10; //编译错误 }
结构总是隐式密封的,因此,不能从它们派生其他结构。
结构不支持继承,所以下列修饰符不能用于结构声明:
结构都派生自System.ValueType,System.ValueType派生自object。
两个可以用于结构成员并与继承相关的关键字是new和override,当创建一个和基类System.ValueType的成员有相同名称的成员时使用它们。
如同其他值类型数据,如果想将一个结构实例作为引用类型对象,必须创建装箱(boxing)副本。装箱的过程就是制作值类型变量的引用类型副本。装箱和拆箱(unboxing)在第16章详述。
6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱
结构可以作为返回值和参数
对于结构进行分配比创建类的实例开销小,所以使用结构替代类有时可以提高性能,但要注意到装箱和拆箱的高代价。
关于结构,需要知道的最后一些事情如下:
结构和类一样,可以实现接口。接口将在第15章阐述。
from: http://www.cnblogs.com/moonache/p/6197243.html
标签:class 教程 图解 一个 blog 第十章 编译 分享 nal
原文地址:https://www.cnblogs.com/GarfieldEr007/p/10126573.html