概念
结构是程序员定义的数据结构,与类非常相似。有数据成员和函数
与类区别
- 类是引用类型而结构是值类型;
- 结构是隐式密封的,这意味着它们不能被派生。
语法
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 + second.X;
third.Y = first.Y + second.Y;
Console.WriteLine($"first.X: {first.X},first.Y:{first.Y}");
Console.WriteLine($"second.X: {second.X},second.Y:{second.Y}");
Console.WriteLine($"third.X: {third.X},third.Y:{third.Y}");
Console.ReadKey();
}
}
结果
first.X: 10,first.Y:10
second.X: 20,second.Y:20
third.X: 30,third.Y:30
结构是值类型
- 结构类型的变量不能为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;
Console.ReadKey();
}
}
构造函数和析构函数
结构可以有实例构造函数和静态构造函数,但不允许有析构函数
实例构造函数
每个结构体都有一个无参数的构造函数
构造函数将结构的每个成员设置为该类型的默认值
值成员设置为它们的默认值,引用成员设置为null
调用构造函数,需使用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: {s1.X}, s1.Y:{s1.Y}");
Console.WriteLine($"s2.X: {s2.X}, s2.Y:{s2.Y}");
Console.ReadKey();
}
}
结果
s1.X: 0, s1.Y:0
s2.X: 5, s2.Y:10
不使用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($"s1.X: {s1.X}, s1.Y:{s1.Y}"); //编译错误
s2.X = 5;
s2.Y = 10;
Console.WriteLine($"s2.X: {s2.X}, s2.Y:{s2.Y}"); //编译成功
Console.ReadKey();
}
}
静态构造函数
与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员
规则与类的静态构造函数一样
以下行为发生前,将会调用静态构造函数
- 调用显式声明的构造函数。
- 引用结构的静态成员。
字段初始化
不允许字段初始化
例
struct Simple
{
public int x = 0; //编译错误
public int y = 10; //编译错误
}
结构是密封的
结构总是隐式密封的,因此,不能从它们派生其他结构。
不能用的修饰符
protected、internal、abstract、virtual