结构体(struct)是一种用户定义的值类型。结构体通常用于封装一组相关的变量(比如数值和字符串),这些变量组成一个小型的数据结构。通俗易懂的解释:结构体(struct)是一种简单的数据类型,用于存储一组相关的数据。与类(class)不同,结构体是值类型,直接存储数据,通常用于表示轻量级对象,例如点的坐标或矩形的尺寸。
3.1 结构体的特点
3.1.1 值类型:结构体是值类型,它们存储在栈上而不是堆上。当你将一个结构体赋值给另一个结构体时,是对其值的拷贝。
3.1.2 轻量级:结构体适用于包含少量数据的小型数据结构。
3.1.3 不可继承:结构体不支持继承。你不能从一个结构体派生出另一个结构体。
3.1.4 默认构造函数:结构体自动提供一个无参数的默认构造函数,用于初始化其字段。
3.1.5 接口实现:结构体可以实现接口。
3.2 结构体的定义和使用
3.2.1 定义结构体
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
// 构造函数
public Point(int x, int y)
{
X = x;
Y = y;
}
// 方法
public void Display()
{
Console.WriteLine($"Point: ({X}, {Y})");
}
3.2.2 使用结构体
public class Program
{
public static void Main()
{
// 使用构造函数创建结构体实例
Point p1 = new Point(10, 20);
p1.Display(); // 输出: Point: (10, 20)
// 默认构造函数
Point p2;
p2.X = 30;
p2.Y = 40;
p2.Display(); // 输出: Point: (30, 40)
// 复制结构体
Point p3 = p1;
p3.X = 50;
p3.Display(); // 输出: Point: (50, 20)
p1.Display(); // 输出: Point: (10, 20) - p1 未受影响
}
}
3.3 结构体和类的对比
特性 | 结构体(struct) | 类(class) |
存储位置 | 栈(Stack) | 堆(Heap |
默认实例化方式 | 无参数构造函数自动初始化 | 必须显式调用构造函数 |
继承 | 不支持继承 | 支持继承 |
值/引用 | 值类型,赋值时复制其内容 | 引用类型,赋值时复制引用 |
适用场景 | 适合小型、简单的数据结构 | 适合复杂或大型的数据结构 |
3.4 使用场景
需要表示一个轻量级对象,且对象不会被修改(即不可变)。
对象的大小小于16字节,并且频繁创建和销毁。
对象的生命周期很短或被封装在另一个对象中使用。
3.5 定义和使用一个简单的结构体
3.5.1 定义一个结构体
public struct Rectangle
{
public int Width { get; set; }
public int Height { get; set; }
public Rectangle(int width, int height)
{
Width = width;
Height = height;
}
public int GetArea()
{
return Width * Height;
}
public void Display()
{
Console.WriteLine($"Rectangle: Width = {Width}, Height = {Height}, Area = {GetArea()}");
}
}
3.5.2 使用结构体
public class Program
{
public static void Main()
{
// 创建结构体实例
Rectangle rect1 = new Rectangle(10, 20);
rect1.Display(); // 输出: Rectangle: Width = 10, Height = 20, Area = 200
// 默认构造函数
Rectangle rect2;
rect2.Width = 15;
rect2.Height = 25;
rect2.Display(); // 输出: Rectangle: Width = 15, Height = 25, Area = 375
// 复制结构体
Rectangle rect3 = rect1;
rect3.Width = 30;
rect3.Display(); // 输出: Rectangle: Width = 30, Height = 20, Area = 600
rect1.Display(); // 输出: Rectangle: Width = 10, Height = 20, Area = 200 - rect1 未受影响
}
}