Cra*_*ney 4 .net string value-type reference-type
注意:这是一个假设的讨论.我实际上并不想实现struct String.
.Net String类可以是值类型(结构),因为它是不可变的并且具有很少的成员.但String不是值类型.可能是因为String是在引入可空类型之前设计的,或者可能是为了匹配Java字符串的行为.
将String更改为值类型或实现String的值类型变体是否有益?它将删除一个间接级别并匹配常见的非可空案例.
简答
字符串必须具有引用类型成员(例如,a char[])以便具有可变大小.因此,无论如何,任何struct String类型都只是伪装成值类型的引用类型.
中等答案
我在这里更深入地讨论了这一点.但我的想法的基本要点是:是的,你可以有一个字符串"值类型",大概是这样的:
public struct String
{
char[] m_characters;
public String(IEnumerable<char> characters)
{
m_characters = characters.ToArray();
}
public char this[int index]
{
get { return m_characters[index]; }
}
// All those other string functions... IndexOf, Substring, etc.
}
Run Code Online (Sandbox Code Playgroud)
......但是真的没有意义.上面基本上只是一个char[]嵌套在shell中的引用类型(围绕a的包装器)看起来像一个值类型.此外,当您以这种方式设计类型时,您会遇到使用值类型(例如,拳击的潜力)而没有任何好处的缺点(上述String类型的实例具有与其包装的引用类型相同的内存分配要求,所以它从GC的角度来看也没有给你带来任何好处.