具有动态字段数的C#值类型

时间:2010-08-14 21:33:27

标签: c# value-type

解释我的问题的最佳方法是使用代码段:

enum Resource { ..., Size }
class ResourceVector 
{
    int[] values = new int[(int)Resource.Size];

    public static ResourceVector operator + (ResourceVector a, ResourceVector b)
    {...}

    ...
}

我们在任何地方都使用此类型,就像它是值类型一样。即我们假设:

ResourceVector b = a;
b += c;

不会影响a,因为这就是我们习惯于讨论向量的方式(这就是具有固定数量字段的向量的行为,如果实现为结构)。

然而,由于这个假设是错误的,它导致了一些非常微妙的错误。

我想知道是否有办法让这种行为成为一种价值类型,而不仅仅是将Resource的成员扩展为struct ResourceVector中的每个成员(这需要触及每个成员)如果我们想添加另一个ResourceVector),请Resource

哦,以防万一,我们正在使用C#2.0。所以没有花哨裤特征: - )

感谢。

1 个答案:

答案 0 :(得分:4)

我认为您将“值类型”与“不可变类型”混淆。您实际上希望ResourceVector是不可变类型

不可变类型是无法更改其内容的类型。构造完成后,实例会保留其值,直到进行垃圾回收。所有操作(如添加)都会返回包含结果的新实例,而不是修改现有实例。

string是最着名的不可变类。 SubstringReplace等所有操作都会返回 new 字符串,而不会修改现有字符串。

一旦你的类型是正确不可变的,从语义上来说,无论它是值类型还是引用类型都无关紧要 - 但它对性能很重要。如果你传递很多值,你应该把它作为引用类型,以避免大量不必要的复制。