如果一个类型的目的是将一小组独立的值(例如点的坐标、枚举字典条目的键和相关值、六项二维转换矩阵等)用胶带粘合在一起,最好的表示方式从效率和语义的角度来看,可能是一个可变的暴露字段结构。请注意,这代表了一种非常不同的使用场景,与结构体表示单个统一概念的情况(例如Decimal或DateTime)相比,Microsoft提供的关于何时使用结构体的建议仅适用于后者。Microsoft所描述的“不可变”结构体风格只适合表示单个统一的概念;如果需要表示一小组独立的值,则适当的替代方案不是不可变类(性能较差),也不是可变类(在许多情况下会提供不正确的语义),而是一个暴露字段结构(如果使用正确,将提供更好的语义和性能)。例如,如果有一个名为MyTransform的结构体,它保存一个二维转换矩阵,则可以使用以下方法:
static void Offset(ref it, double x, double y)
{
it.dx += x;
it.dy += y;
}
比起 更快,也比起 更清晰
static void Offset(ref it, double x, double y)
{
it = new Transform2d(it.xx, int.xy, it.yx, it.yy, it.dx+x, it.dy+y);
}
或者
Transform2d Offset(double dx, double dy)
{
it = new Transform2d(xx, xy, yx, yy, dx+x, dy+y);
}
了解dx和dy是Transform2d
的字段就足以知道第一个方法修改这些字段并且没有其他副作用。相比之下,要知道其他方法的作用,就必须检查构造函数的代码。