.Net中的值类型 - 字符串是单独的类型吗?

sim*_*sjo 1 .net

我们有ObjectValueType....和String....

String派生自object,但它是不可变的.它是否属于自己的类型,因为它不像其他对象一样?它是唯一具有这种不可变行为的对象吗?是运行时,编译器还是库定义它?在.Net还有其他类似的案例吗?

编辑:是的,我也创建了在构造之后不允许更改的类; 不可变对象.但是字符串不比这更特别吗?

Jon*_*eet 9

string是一种参考类型.还有很多其他不可变类型,你可以创建自己的类型:只是不提供任何改变状态的成员!这是一个例子:

public class Int32Wrapper
{
    private readonly int value;
    public int Value { get { return value; } }

    public Int32Wrapper(int value)
    {
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,string也重载==和!=,覆盖EqualsGetHashCode等等......所有这些都可以在自己的类型做了.

string确实有一些真正的特殊属性:

  • 这是IL中唯一的文字格式(以及支持语言)的唯一引用类型
  • 有IL指令专门使用字符串
  • 除了数组之外,string是唯一一种类型,其中对象的大小因实例而异.(其他类型取决于您正在使用的CLR,但对于任何一个CLR,其他类型的所有实例将具有相同的大小 - 字符串和数组因内容而异.)
  • 如果你new String(new char[0])反复打电话,你每次都会得到相同的参考
  • 它以神奇的方式与interop marshaller交互:)

  • 他只是阐述了它的特殊方式.一切都是平等的. (2认同)