C#-结构体
目录
在 C# 中, 结构体(struct) 是一种 值类型 (Value Type),用于标识小型、轻量的数据对象。它和类(class)很像,但在内存分配、传递方式、使用场景上有明显区别。
一、C# 中结构体是什么
结构体是用 struct 关键字定义的数据类型。
public struct Point
{
public int X;
public int Y;
}使用:
Point p1 = new Point();
p1.X = 10;
p1.Y = 20;结构体的核心特点:
| 特性 | 说明 |
|---|---|
| 值类型 | 存储在栈(或对象内部),复制时是 值类型 |
| 不能继承 | struct 不能继承其他 struct 或 class |
| 可以实现接口 | 但不能继承类 |
| 默认有无参构造函数 | 不允许自定义无参构造(旧版本) |
| 适合小对象 | 一般推荐 小于16字节 |
struct vs class 的核心区别
| 对比 | struct | class |
|---|---|---|
| 类型 | 值类型 | 引用类型 |
| 内存 | 栈 | 堆 |
| 赋值 | 拷贝整个对象 | 拷贝引用 |
| 继承 | 不支持 | 支持 |
| null | 不可以 | 可以 |
示例:
struct A { public int X ;}
class B { public int Y ;}
A a1 = new A();
A a2 = a1; // 复制值
B b1 = new B();
B b2 = b1; // 复制引用在 WPF 中常用的 struct
几何、尺寸、颜色、布局数据等类型都是 struct。
| struct | 作用 |
|---|---|
| Point | 坐标 |
| Size | 宽高 |
| Rect | 矩形 |
| Thickness | Margin / Padding |
| Color | 颜色 |
| Vector | 向量 |
例:
Point p = new Point(100, 200);或:
button,Margin = new Thickness(10, 5, 10, 5);这里 Thickness 就是 struct。
二、WPF 中什么场景会用 struct
1.布局尺寸数据
Size size = new Size(200, 100);在 Measure / Arrange 阶段使用。
2.坐标和图形计算
Point start = new Point(0, 0);
Point end = new Point(100, 100);用于:
- Canvas
- Drawing
- Geometry
3.UI 边距
button.Margin = new Thickness(20);Thickness 是 struct,因为它只是;
Left
Top
Right
Bottpm4.颜色
Color c = Color.FromRgb(255, 0, 0);颜色是小型数据结构,非常是适合 struct。
三、WPF 中适合用 struct 的场景 和不适合 struct 的场景
适合用struct:
- 标识 简单数据对象
- 数据 不可变(immutable)
- 很小 (通常 < 16 bytes)
- 不需要继承
- 高频创建
public struct MyPoint
{
public double X;
public double Y;
}不适合用 struct
如果满足一下情况,应该用 class:
- 对象较大
- 需要继承
- 需要引用语义
- 会频繁修改
- 用作 ViewModel
总结:
WPF中涉及这些 struct 的原因:
- 减少 GC 压力:布局系统创建大量 Point / Size
- 提高性能:值类型在栈上更快
- 表达数学对象
例如:Point,Vector,Matrix
struct 本质: 一个轻量的值类型数据结构。
自定义 struct 的典型场景:表示一个小型、不可变、纯数据的值类型。
例如:
- 坐标
- 颜色
- 向量
- 范围
- 尺寸