1

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

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每个成员扩展为它们自己的成员 a (如果我们希望添加另一个,则struct ResourceVector需要触摸每个成员)。ResourceVectorResource

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

谢谢。

4

1 回答 1

4

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

不可变类型是无法更改其内容的类型。一旦构造,实例将保留其值,直到它被垃圾收集。加法等所有操作都返回一个包含结果的新实例,而不是修改现有实例。

string是最著名的不可变类。所有操作都喜欢SubstringReplace返回一个字符串,并且不修改现有字符串。

一旦你的类型是不可变的,从语义上讲,它是值类型还是引用类型就不再重要了——但它对性能很重要。如果您经常传递值,您可能应该将其设为引用类型,以避免大量不必要的复制。

于 2010-08-14T21:39:47.310 回答