在C#中,结构体(struct)是一种值类型,用于将一组相关的数据成员组合成一个整体。与类这种引用类型不同,结构体变量直接保存数据本身,当把一个结构体变量赋值给另一个变量时,会发生完整的数据复制。这使得结构体在表达轻量数据模型时更加直观和高效。

结构体与类的主要区别
虽然结构体和类都能封装数据和行为,但它们在内存分配和语义上有明显差异。下面通过表格说明常见区别:
| 对比项 | 结构体(struct) | 类(class) |
|---|---|---|
| 类型分类 | 值类型 | 引用类型 |
| 内存分配 | 通常分配在栈上 | 分配在托管堆上 |
| 赋值行为 | 复制全部数据 | 复制引用地址 |
| 继承能力 | 不能继承其他结构体或类 | 支持继承 |
如何定义和使用结构体
使用 struct 关键字即可定义一个结构体。以下示例展示了一个表示二维坐标点的结构体:
using System;
// 定义一个表示坐标点的结构体
public struct Point
{
// 字段
public int X;
public int Y;
// 构造函数
public Point(int x, int y)
{
X = x;
Y = y;
}
// 方法
public void Move(int dx, int dy)
{
X += dx;
Y += dy;
}
public override string ToString()
{
return "(" + X + ", " + Y + ")";
}
}
class Program
{
static void Main()
{
// 使用结构体
Point p1 = new Point(10, 20);
Point p2 = p1; // 此处发生值复制
p2.Move(5, 5);
Console.WriteLine("p1: " + p1); // 输出 (10, 20)
Console.WriteLine("p2: " + p2); // 输出 (15, 25)
}
}
结构体适用场景
- 数据量小且逻辑简单,例如坐标、矩形、颜色等
- 希望避免堆分配和垃圾回收开销的高性能场景
- 需要值语义,即赋值后双方互不影响
使用结构体的注意事项
结构体虽然方便,但也有限制。它不支持用户定义的默认构造函数(C# 10之前),所有字段在构造时必须完全赋值。另外,如果结构体过大,频繁复制会带来性能损耗,此时应优先考虑类。
结构体是C#值类型的典型代表,理解它的复制语义和内存行为,是写出正确且高效代码的基础。
总结
在C#中,结构体是一种轻量的值类型,适合封装简单数据集合。通过 struct 定义,具备字段、方法和属性,但不支持继承。掌握结构体与类的差异,能帮助开发者在实际项目中做出更合理的类型选择。