C# 为什么该类型从引用类型更改为值类型

C# 为什么该类型从引用类型更改为值类型,c#,struct,C#,Struct,在我正在使用的一些代码库中,最初实现了一个与此类似的简单类型(我无法发布精确的代码,但就本问题而言,所示代码完全等效): 后来,有一个未记录的更改,其中类型更改为值类型: struct S { private String name; public String Name { get => name ?? ""; private set => name = value; } public S(string

在我正在使用的一些代码库中,最初实现了一个与此类似的简单类型(我无法发布精确的代码,但就本问题而言,所示代码完全等效):

后来,有一个未记录的更改,其中类型更改为值类型:

struct S {
    private String name;
    public String Name { 
        get => name ?? ""; 
        private set => name = value; }
    public S(string name) { this.name = name; }
    public Blah Frob() { .... }
}
我非常清楚值类型和引用类型之间的差异,但我不确定是什么原因使这种更改看起来是正确的。与等效引用类型相比,只保存对另一个不可变引用类型的引用的不可变值类型有什么好处?我错过了什么


我似乎记得Eric Lippert曾经对一个问题发表过评论,为什么
string
不是一个相同的结构;结构只包含一个引用类型的引用,但我再也找不到了,这有什么好处。

这是否回答了您的问题?它可以是优化内存使用的尝试(另请参阅)或性能优化(结构可能位于堆栈上),但这取决于此类型的使用模式。如果没有适当的审查/文档,某些东西肯定不应该改变,不幸的是,如果程序员没有写这些东西,几乎不可能猜出他们在想什么。对于要将类更改为结构的人来说,他们可能知道它被分配到何处(堆栈或堆),在热路径中使用它们的好处是,他们将很好地理解垃圾收集、结构复制惩罚和相关限制,以及如何使用in关键字和所有其他技术通过引用传递它们。,他们最好对代码进行基准测试,以获得细粒度优化和最小的分配。。。否则,他们只是浪费了他们的时间和你的时间,充其量也没有什么好处,甚至可能是更糟糕的性能所讨论的类型很小——8个字节——不可变,逻辑上是一个值;为什么它不是一个值类型?这些正是我们希望使用值类型的条件。更具体地说,该类型的目的似乎是向字符串添加语义信息:该字符串是一个名称。添加语义信息的包装器类型是值类型的常见用法;考虑枚举,例如,在内嵌的内嵌包中添加语义的包装类型。这能回答你的问题吗?它可以是优化内存使用的尝试(另请参阅)或性能优化(结构可能位于堆栈上),但这取决于此类型的使用模式。如果没有适当的审查/文档,某些东西肯定不应该改变,不幸的是,如果程序员没有写这些东西,几乎不可能猜出他们在想什么。对于要将类更改为结构的人来说,他们可能知道它被分配到何处(堆栈或堆),在热路径中使用它们的好处是,他们将很好地理解垃圾收集、结构复制惩罚和相关限制,以及如何使用in关键字和所有其他技术通过引用传递它们。,他们最好对代码进行基准测试,以获得细粒度优化和最小的分配。。。否则,他们只是浪费了他们的时间和你的时间,充其量也没有什么好处,甚至可能是更糟糕的性能所讨论的类型很小——8个字节——不可变,逻辑上是一个值;为什么它不是一个值类型?这些正是我们希望使用值类型的条件。更具体地说,该类型的目的似乎是向字符串添加语义信息:该字符串是一个名称。添加语义信息的包装器类型是值类型的常见用法;考虑枚举,例如,它是围绕添加语义的int类型的包装类型。
struct S {
    private String name;
    public String Name { 
        get => name ?? ""; 
        private set => name = value; }
    public S(string name) { this.name = name; }
    public Blah Frob() { .... }
}