C# 中的 结构体(struct)是一种值类型,用于封装相关的数据和功能。它与类有许多相似之处,但也有显著的不同之处。以下是 C# 中结构体的主要特点:
1. 值类型
- 特点:结构体是值类型,存储在堆栈中(stack),而不是托管堆(heap)。当一个结构体被赋值给另一个结构体时,会复制其内容,而不是共享引用。
- 示例:struct Point { public int X; public int Y; } class Program { static void Main() { Point p1 = new Point { X = 10, Y = 20 }; Point p2 = p1; p2.X = 30; Console.WriteLine(p1.X); // 输出: 10,p1 未被影响 } }
2. 无需显式构造函数
- 特点:结构体总是有一个隐式的无参数构造函数,用于初始化其所有字段为默认值。
- 注意:不能为结构体显式定义无参数构造函数,但可以定义其他参数化构造函数。
- 示例:struct Point { public int X; public int Y; // 参数化构造函数 public Point(int x, int y) { X = x; Y = y; } }
3. 不支持继承
- 特点:结构体不能继承自其他类或结构体,也不能被继承。但它可以实现接口。
- 示例:interface IMovable { void Move(); } struct Point : IMovable { public int X, Y; public void Move() => X += 1; }
4. 与类的成员特性类似
- 特点:结构体可以包含以下成员:字段属性方法构造函数静态成员
- 示例:struct Rectangle { public int Width, Height; public int Area => Width * Height; // 属性 public void Resize(int factor) => Width *= factor; // 方法 }
5. 性能高,适合小型数据封装
- 特点:结构体适合用于存储和操作小型、简单的数据。由于存储在堆栈中,避免了垃圾回收(GC)的开销。
- 示例场景:表示二维坐标(如 Point)存储 RGB 颜色值简单的几何形状(如 Rectangle)
6. 默认不可为 null
- 特点:作为值类型,结构体默认不可为 null,但可以使用可空类型(Nullable
或 T?)允许其为 null。 - 示例:Point? nullablePoint = null; if (nullablePoint.HasValue) { Console.WriteLine($"X: {nullablePoint.Value.X}"); }
7. 不支持析构函数
- 特点:结构体不支持析构函数(~Destructor),因为它们是值类型,不涉及垃圾回收。
8. 支持静态字段和方法
- 特点:结构体可以定义静态字段和静态方法,但不能定义静态构造函数。
- 示例:struct MathHelper { public static double Pi = 3.14159; public static double Square(double value) => value * value; }
9. 不支持显式初始化字段
- 特点:结构体的字段不能直接在声明时初始化,必须在构造函数中初始化或通过代码赋值。
- 示例:struct Point { public int X; // 正确 public int Y = 0; // 错误 }
10. 使用限制
- 特点:结构体的成员应该尽可能小和简单,因为结构体是值类型,频繁的值复制会降低性能。
- 适用场景:数据量小、短期存在的数据不需要继承的简单数据封装
总结
特性 | 结构体 (struct) | 类 (class) |
类型 | 值类型 | 引用类型 |
继承 | 不支持继承,支持接口实现 | 支持继承和接口实现 |
内存分配 | 堆栈 | 堆 |
默认构造函数 | 隐式提供,初始化为默认值 | 无默认构造函数,需显式定义 |
可为空 | 默认不可为 null,可使用可空类型 | 默认可为 null |
结构体在需要封装轻量级数据时非常有用,但当需要继承、复杂操作或需要大量对象时,类是更合适的选择。