代码之家  ›  专栏  ›  技术社区  ›  luqui

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

  •  1
  • luqui  · 技术社区  · 14 年前

    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 如果我们想再加一个 ).

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

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Timwi    14 年前

    我认为你混淆了值类型和不可变类型。你真的希望你的资源向量是一个 不可变类型 .

    不可变类型是无法更改其内容的类型。一旦构建,实例将保留其值,直到它被垃圾回收。所有操作(如加法)都返回a 新实例

    string 是最著名的不可变类。所有操作如 Substring Replace 返回a 新的

    一旦您的类型是正确的不可变的,从语义上讲,它不再是一个值类型还是一个引用类型那么重要,但它关系到性能。如果您传递了大量的值,可能应该将其作为引用类型,以避免大量不必要的复制。