在.Net中的struct String会有好处吗?

Cra*_*ney 4 .net string value-type reference-type

注意:这是一个假设的讨论.我实际上并不想实现struct String.

.Net String类可以是值类型(结构),因为它是不可变的并且具有很少的成员.但String不是值类型.可能是因为String是在引入可空类型之前设计的,或者可能是为了匹配Java字符串的行为.

将String更改为值类型或实现String的值类型变体是否有益?它将删除一个间接级别并匹配常见的非可空案例.

Dan*_*Tao 7

简答

字符串必须具有引用类型成员(例如,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的角度来看也没有给你带来任何好处.