结构类型
1 结构
结构存放在栈中按值传递,与存放在堆中对象相比,结构具有性能上的优势。但把结构当作一个参数传递给方法就不见得了,因为传递前它会复制它的一个副本,和引用 类型相比,结构越复杂,复制的开销就越大。因此结构应该用来表示小的数据结构。
结构与类的另一人差别是,结构不能定义无参数的构造函数,也不能定义析构函数。无参的构造函数是运行时提供的,用来将所有的数据成员初始化。而结构定义的构造函数必须为构造函数包含的每个字段赋值。
结构不支持实现继承,可以提供一个或多个接口的实现。
定义结构
<access_modifer> struct<struct_name>
{
// Data Members
// Methods
//nested type definitions
}
创建结构的实例与类相同
2 winform中常用结构
2.1 二维坐标点
存在一种"坐标点“数据类型,它在图形环境中非常流行,并且可以调整到足够小使之成为结构而不是类。在.NET Framework 中它是用Ponit结构表示。在二维坐标系中,一个点由用一对数值来表示(x,y),其中x是水平坐标,y是垂直坐标。
point有两可以读写属性,分别叫做x,y,是一个32位整数。例如我们实例化一个Point
Point pt=new Point(100,15)
Point还有一个静态字段:Point Pt=Pointt.Empety ;该语句使x,y都为0;
Point还有个名为”IsEmpty“的只读属性,如果x,y的值都为0,则返回true;
Point从Oject继承了GetType方法通过ValueType的方式覆盖了Object中的GetHashCode()、ToString、和Equals方法,还独立实现了一个名为”Offset“的方法
Point实例的方法
Type GetType()
int GetHashCode()
string ToString()
bool Equales(Point point)
void Offset(int dx,int dy)
例
Point pt=new Point(12,15);
string str=pt.Tostring(); //{x=12,y=15}
测试一个坐标点是否等于另一个坐标点 if(pt1.Equals(pt2))或if(pt1==pt2)
Offset方法:
pt.Offset(10,-10);
与向属性添加两个偏移量的方法基本相同
pt.x+=10;
pt.y+=-10;
2.2 Point 数组
要想创建一个Point数组(假设包含30个点),可以像这样创建
Point[] Pt=new Point[30];
3 size 结构
Size结构与Point结构非常相似,但它使用Width和Height属性.
可以像创建一个Point结构一样创建一个Size结构
Size size=new Size(100,200);
Height和Width的值可以负值。Point和Size可以相互构造
Point的构造函数
Point()
Point(int xyPacked)
Point(int x,int y)
Point(Size size)
Size的构造函数
Size()
Size(int width,int height)
Size(Point point)
你可以将Point强制转换为Size,相反也可以将Size转换为Point
pt=(Point)size;
size=(Size)pt;
Size重构了加减法运算符,你可以对Size做加减法运算
它们的浮点版本PointF结构和SizeF结构
PointF ptf=new PointF(12.5f,15.8f)
SizeF sf=new SizeF(11.1f,11.5f)
PointF不包含Offset方法。可以将Point强制转换成PointF
ptf=(PointF)pt;//反之则不行
如果想将PointF转换成Point,需要使用Point的一些静态方法
Point.Round(PointF ptf) //将x,y四舍五入为最近的整数
Point.Truncate(PointF ptf)// 舍去小数部分并且朝0的方向舍弃 0.9和-0.9 者是0
Point.Celling(Point ptf)//向下一个最大整数转换 0.9为1而-0.9为0
Size的转换同上
不能从PointF到SizeF的转换。