什么是结构
结构是程序员定义的数据类型,与类非常相似。有数据成员和函数成员。
区别:类是引用类型而结构是值类型;
结构是隐式密封的,这意味着它们不能被派生。
声明结构:struct关键字
struct StructName
{
MemberDeclarations
}
例:
struct Point
{
public int X;
public int Y;
}
class Program
{
static void Main(string[] args)
{
Point first, second, third;
first.X = 10; first.Y = 10;
second.X = 20; second.Y = 20;
third.X = first.X + first.Y; 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("thirdt:{0},{1}", third.X, third.Y);
Console.ReadKey();
}
}
结构是值类型
结构类型的变量不能为null;
两个结构变量不能引起同一对象。
class CSimple
{
public int X;
public int Y;//存在栈中
}
struct Simple
{
public int X;
public int Y;//存在堆中
}
对结构赋值
把一个结构值赋值给另一个结构,就将一个结构的值复制给另一个结构。
复制类变量时只是复制引用。
class CSimple
{
public int X;
public int Y;
}
struct Simple
{
public int X;
public int Y;
}
class Program
{
static void Main(string[] args)
{
CSimple cs1 = new CSimple(), cs2 = null;//类实例
Simple ss1=new Simple() ,ss2=new Simple() ;//结构实例
cs1.X = ss1.X = 5;//将5赋值给ss1.X和cs1.X
cs1.Y = ss1.Y = 10;//将10赋值给ss1.Y和cs1.Y
cs2 = cs1;//赋值类实例
ss2 = ss1;//赋值结构实例
Console.ReadKey();
}
}
在类赋值之后,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(string[] args)
{
Simple s1 = new Simple();//调用隐式构造函数
Simple s2 = new Simple(5,10);//调用构造函数
Console .WriteLine ("{0},{1}",s1.X ,s1.Y );
Console.WriteLine("{0},{1}", s2.X, s2.Y);
Console.ReadKey();
}
}
静态构造函数
与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。结构的静态构造函数遵从与类的静态构造函数一样的规则。
以下两种行为,将会调用静态构造函数:
调用显式声明的构造函数。
引用结构的静态成员。
字段初始化是不允许的
struct Simple
{
public int X=0;//不允许//编译错误
public int Y=10;//编译错误
}
结构的密封的
结构总是隐式密封的,因此,不能派生其他结构。
不能用于结构的修饰符:
protected;
abstract;
virtual;
结构本身派生自System.ValueType
装箱和拆箱
如果想将一个结构实例作为引用类型对象,必须创建装箱的副本。
装箱的过程就是制作值类型变量的英语类型副本。
结构作为返回值和参数
结构可以用作返回值和参数
返回值:当结构作为返回值时,将创建它的副本并从函数成员返回。
值参数:当结构被用作值参数时,将创建实参结构的副本。该副本用于方法的执行。
ref和out参数:传入的方法是该结构的一个引用,这样就可以修改其数据成员。
关于结构的其他信息
对结构进行分配比创建类的实例开销小,使用使用结构代替类有时可以提高性能,但要注意装箱和拆箱的高代价。
预定义简单类型实际上在.net中都实现为结构。
可以使用与声明分部类相同的方法声明分布结构。
结构和类一样,可以实现接口。