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

标签 c# value-type

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

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 是最著名的不可变类。 SubstringReplace 等所有操作都会返回一个 字符串,并且不会修改现有字符串。

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

关于具有动态字段数的 C# 值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3485201/

相关文章:

c# - Response.Redirect 从一个 Web 项目到 Visual Studio 中的另一个

c# - 当 'object' 的某个字段可以有多种类型时,如何访问它而不将其转换为一种类型?

c# - IIS 日志问题

swift - 值类型错误 SWIFT/XCODE

ios - Swift 中的 Equatable 测试

c# - 在 C# 中,为什么我不能在 foreach 循环中修改值类型实例的成员?

C# : Custom implicit cast operator failing

c# - 抽象类中 protected 抽象或公共(public)抽象方法

c# - 在 C# 中,值类型是可变的还是不可变的?

.net - 比较值类型 N 的对象