代码之家  ›  专栏  ›  技术社区  ›  simendsjo

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

  •  1
  • simendsjo  · 技术社区  · 14 年前

    我们有 Object ValueType .... 以及 String ....

    字符串是从对象派生的,但它是不可变的。它是否被认为是它自己的一种类型,因为它的行为与其他对象不同?它是唯一具有这种不变行为的对象吗?是运行时、编译器还是库定义了这一点?在.Net中还有其他类似的情况吗?

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

    3 回复  |  直到 14 年前
        1
  •  9
  •   Jon Skeet    14 年前

    string 是引用类型。不过,还有很多其他不可变类型,您可以创建自己的类型:只是不要提供任何更改状态的成员!举个例子:

    public class Int32Wrapper
    {
        private readonly int value;
        public int Value { get { return value; } }
    
        public Int32Wrapper(int value)
        {
            this.value = value;
        }
    }
    

    当然, 一串 也重载==和!=,覆盖 Equals GetHashCode 等。。。所有这些都可以在您自己的类型也。

    一串 有吗 真正的特殊属性:

    • 它是唯一在IL(和支持语言)中有文字格式的引用类型
    • 有专门使用字符串的IL指令
    • 除了数组之外,string是唯一一种对象大小随实例而变化的类型(其他类型因所使用的CLR而异,但对于任何一个CLR,其他类型的所有实例的大小都相同—字符串和数组因内容而异。)
    • 如果你打电话 new String(new char[0])
    • 它以神奇的方式与interop marshaller交互:)
        2
  •  3
  •   Tim Robinson    14 年前

    类的作者确定类的实例是否是不可变的。

    下面是另一个不可变的类:(引用类型,而不是值类型)

    public class Person
    {
        private readonly string name;
        private readonly int age;
    
        public Person(string name, int age)
        {
            this.name = name;
            this.age = age.
        }
    
        public string Name
        {
            get { return name; }
        }
    
        public int Age
        {
            get { return age; }
        }
    }
    
        3
  •  -3
  •   CesarGon    14 年前

    字符串是引用类型(请参见 here ,赋值复制字符串内容而不是对象的引用 .