.NET中的结构是否意味着是常量的集合?

时间:2014-01-20 15:31:12

标签: .net struct constants immutability

你们将会读到结构体是不可变的/保持不变的值。

我想知道为什么我没有看到更简单和简洁的定义: 如果您有多个常量值,并且可以将它们分组到一个有意义的单元/单个有意义的名称下(和/或想要添加/附加某些行为) - 那就是当您使用结构时 - 只不过是一组常量,可能方法“附加”。

实际上反思我上面写的内容 - 定义结构的唯一真正原因是我是否有行为应该“附加”到它们身上。否则,我会很好地简单地声明一个公共静态类,以及那里的所有常量。

示例:

public static class Constants
{
    public static string C1 = "c1";
    public static string C2 = "c2";
    public static string C3 = "c3";
}

相同,使用结构

public struct Constants
{
    public string C1 = "c1";
    public string C1 = "c2";
    public string C1 = "c3";
}

如果我不需要对这些常量值做任何行为,使用常量似乎是正确的解决方案,因为使用结构我会不必要地复制相同的值。

我说错了吗?

1 个答案:

答案 0 :(得分:2)

在.NET语言中,结构基本上是变量的集合而不是对象。除了通过结构赋值(替换)而不允许修改成员的结构,它将一个结构的所有成员复制到另一个结构中,其行为类似于对象;允许成员以任何其他方式进行修改的一个不会。有些人提出了一个简化的观点,即“.NET中的所有东西都是一个对象”,即使这样的观点与.NET的实际工作方式不一致;不像对象那样的类型违背了这种哲学。

实际上,结构有两个很好的用途。在不可变对象可能在语义上理想但效率低下的情况下,人们喜欢使用“一切都是对象”的用法。除了替换之外不允许修改的结构提供基本上相同的行为,但是如果满足某些条件则可以提供更好的性能。 MSDN指南很好地解释了数据类型应该满足哪些条件才能使“对象样式”结构成为最佳表示。

另一种有效的用法,虽然它与“一切都是对象”的哲学相矛盾,但是使用结构(即变量的集合)作为独立但相关变量的集合。除了需要源和目标绘图上下文以及复制模式之外,还需要具有源X,Y,宽度和高度以及目标X,Y,宽度和高度等图形块复制操作。这是十一个参数。将(X,Y,Width,Height)的两组分组到类型Rectangle中将参数计数减少到更合理的五。从语义和性能的角度来看,传递Rectangle等同于传递四个单独的变量,应该用这样的术语来思考。有些人发现像以下方法“令人惊讶”:

void Foo(Rectangle r) { r.X += 23; }

不会修改传入的矩形,但是如果要将该方法重写为语义等效的:

void Foo(int r_X, int r_Y, int r_Width, int r_Height) { r_X += 23; }
很明显,它只会修改r_X的传入副本。

如果想要一个代表“可共享”矩形的类型,以便可以附加多个项目,并且对所有这些项目都可以看到对该矩形的更改,那么它应该是一个类。但是,如果希望有一个类型可以保持其边界作为变量的集合,这些变量独立于Universe中的任何其他变量但可以方便地独立工作但也作为一个组传递,那么一个简单暴露的结构字段XYWidthHeight将是理想的。这样的结构不会像对象一样,但这并不意味着它没用。