解释我的问题的最好方法是使用代码片段:
enum Resource { ..., Size }
class ResourceVector
{
int[] values = new int[(int)Resource.Size];
public static ResourceVector operator + (ResourceVector a, ResourceVector b)
{...}
...
}
我们到处都在使用这种类型,就好像它是一种值类型一样。 IE。我们假设:
ResourceVector b = a;
b += c;
不会影响 a
,因为这就是我们习惯于谈论向量的方式(如果实现为结构,这就是具有固定数量字段的向量的行为方式)。
然而,由于该假设是错误的,因此导致了一些极其微妙的错误。
我想知道是否有办法让它表现为值类型,而不仅仅是将 Resource
的成员扩展到 struct ResourceVector
中各自的成员中>(如果我们想添加另一个 Resource
,这需要接触 ResourceVector
的每个成员)。
哦,以防万一,我们正在使用 C# 2.0。所以没有花哨的功能:-)
谢谢。
最佳答案
我认为您混淆了“值类型”和“不可变类型”。您实际上希望您的 ResourceVector 是一个不可变类型。
不可变类型是一种无法更改其内容的类型。一旦构造完成,实例将保留其值,直到它被垃圾回收。所有操作(例如加法)都会返回一个包含结果的新实例,而不是修改现有实例。
string
是最著名的不可变类。 Substring
和 Replace
等所有操作都会返回一个新 字符串,并且不会修改现有字符串。
一旦您的类型适本地不可变,从语义上讲它是值类型还是引用类型就不再那么重要了——但它对性能很重要。如果您经常传递值,您可能应该将其设为引用类型以避免大量不必要的复制。
关于具有动态字段数的 C# 值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3485201/