结构体(struct)
什么是结构体
结构是程序员定义数据类型,与类非常相似。它们有数据成员和函数成员,虽然相似,但是有许多区别,区别如下:
●类是引用类型二结构是值类型。
●结构是隐式密封的,这意味着它们不能被派生。
结构体是值类型
●结构类型的变量不能为null;
●两个结构变量不能引用同一对象。
对结构赋值
把一个结构赋值给另一个结构,就将一个结构的值复制给另一个结构,这和赋值类变量不同,赋值类变量时只赋值引用。
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;
cs1.Y = ss1.Y = 10;
cs2 = cs1;
ss2 = ss1;
cs2.X = 500;
cs2.Y = 600;
ss2.X = 700;
ss2.Y = 800;
Console.WriteLine("cs1.X={0}", cs1.X);
Console.WriteLine("cs1.Y={0}", cs1.Y);
Console.WriteLine("cs2.X={0}", cs2.X);
Console.WriteLine("cs2.Y={0}", cs2.Y);
Console.WriteLine("ss1.X={0}", ss1.X);
Console.WriteLine("ss1.Y={0}", ss1.Y);
Console.WriteLine("ss2.X={0}", ss2.X);
Console.WriteLine("ss2.Y={0}", ss2.Y);
Console.WriteLine();
Console.WriteLine();
Console.ReadKey();
}
}
构造函数和析构函数
结构可以有实例构造函数和静态构造函数,但允许有析构函数。
实例构造函数
语言隐式地为每个结构提供一个无参的构造函数,这个构造函数把结构的每个成员设置为该类型的默认值。值成员设置成它们的默认值,引用成员设置成null。
预定义的无参构造函数对每个结构都存在,而且不能删除或重定义,但是可以创建另外的构造函数,只要它们有参数。注意,这和类不同。对于类,编译器只在没有其他构造函数声明时提供隐式的无参数构造函数。
调用一个构造函数,包括隐式无参数构造函数,要使用new运算符。注意,即使不从堆中分配内存也要使用new运算符。
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("s1.X={0}",s1.X);
Console.WriteLine("s1.Y={0}", s1.Y);
Console.WriteLine("s2.X={0}", s2.X);
Console.WriteLine("s2.Y={0}", s2.Y);
Console.ReadKey();
}
}
也可以不使用new运算符创建结构的实例,然而,如果这样做,有限制,如下:
●在显示设置数据成员之后,才能使用它们的值;
●在堆所有数据成员赋值之后,才能调用任何函数成员。
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, s2;
Console.WriteLine("{0},{1}",s1.X,s1.Y);
s2.X = 5;
s2.Y = 10;
Console.WriteLine("{0},{1}",s2.X,s2.Y);
Console.ReadKey();
}
}
静态构造函数
与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。结构的静态构造函数遵从与类的静态构造函数一样的规则。
以下两种行为,热议一种发生之前,将会调用静态构造函数。
●调用显示声明的构造函数。
●引用结构的静态成员。
构造函数和析构函数小结
不允许在结构中初始化字段
结构是密封的
结构总是隐式密封的,因此,不能从它们派生其他结构。
由于结构不支持继承,个别类成员修饰符用在结构成员上将没有意义,因此不能在结构成员声明时使用。不能使用于结构的修饰符如下:
●protected
●internal
●abstract
●virtual
结构钢本身派生自System.ValueType,System.ValueType派生自object。
两个可以用于结构成员并与继承相关的关键字是new和override修饰符,当创建一个和基类System.ValueType的成员有相同名称的成员时使用它们,所有结构都派生自System.ValueType。
结构作为返回值和参数
结构可以用作返回值和参数
返回值 当结构作为返回值时,将创建它的副本并从函数成员返回。
值参数 当结构被用作值参数时,将创建实参结构的副本,该副本用于方法的执行中。
ref和out参数 如果把一个结构用作ref或out参数,传入方法的是该结构的一个引用,这样就可以修改器数据的成员。