.Net中的值类型-字符串是单独的类型吗?
我们有.Net中的值类型-字符串是单独的类型吗?,.net,.net,我们有对象和值类型。。。。和字符串 字符串是从对象派生的,但它是不可变的。它是否被认为是它自己的一种类型,因为它的行为与其他对象不同?它是唯一具有这种不变行为的对象吗?是运行时、编译器还是库定义了这一点?在.Net中还有其他类似的情况吗 编辑:是的,我也创建了在构建后不允许更改的类;不可变对象。但是字符串不是比这更特殊吗?字符串是一种引用类型(请参阅),但其行为有点特殊。正如您所说,它是不可变的,赋值复制字符串内容而不是对象的引用 关于你的问题,字符串当然是一种“独立”类型。我不知道你所说的“分
对象
和值类型
。。。。和字符串
字符串是从对象派生的,但它是不可变的。它是否被认为是它自己的一种类型,因为它的行为与其他对象不同?它是唯一具有这种不变行为的对象吗?是运行时、编译器还是库定义了这一点?在.Net中还有其他类似的情况吗
编辑:是的,我也创建了在构建后不允许更改的类;不可变对象。但是字符串不是比这更特殊吗?字符串是一种引用类型(请参阅),但其行为有点特殊。正如您所说,它是不可变的,赋值复制字符串内容而不是对象的引用
关于你的问题,字符串当然是一种“独立”类型。我不知道你所说的“分离”是什么意思,但.NET中的每个类和结构都是自己的类型。字符串是引用类型(请参阅),但其行为有点特殊。正如您所说,它是不可变的,赋值复制字符串内容而不是对象的引用
关于你的问题,字符串当然是一种“独立”类型。我不知道你所说的“分离”是什么意思,但是.NET中的每个类和结构都是自己的类型。
string
是引用类型。不过,还有很多其他不可变类型,您可以创建自己的类型:只是不要提供任何更改状态的成员!下面是一个例子:
public class Int32Wrapper
{
private readonly int value;
public int Value { get { return value; } }
public Int32Wrapper(int value)
{
this.value = value;
}
}
当然,string
也会重载==和!=,覆盖等于
和GetHashCode
等。。。所有这些都可以在您自己的类型中完成
string
确实有一些真正特殊的属性:
- 它是唯一在IL(和支持语言)中有文字格式的引用类型
- 有专门使用字符串的IL指令
- 除了数组之外,string是唯一一种对象大小随实例而变化的类型。(其他类型因您使用的CLR而异,但对于任何一个CLR,其他类型的所有实例都具有相同的大小-字符串和数组因内容而异。)
- 如果反复调用
,每次都会得到相同的引用newstring(newchar[0])
- 它以神奇的方式与互操作封送员交互:)
字符串
是一种引用类型。不过,还有很多其他不可变类型,您可以创建自己的类型:只是不要提供任何更改状态的成员!下面是一个例子:
public class Int32Wrapper
{
private readonly int value;
public int Value { get { return value; } }
public Int32Wrapper(int value)
{
this.value = value;
}
}
当然,string
也会重载==和!=,覆盖等于
和GetHashCode
等。。。所有这些都可以在您自己的类型中完成
string
确实有一些真正特殊的属性:
- 它是唯一在IL(和支持语言)中有文字格式的引用类型
- 有专门使用字符串的IL指令
- 除了数组之外,string是唯一一种对象大小随实例而变化的类型。(其他类型因您使用的CLR而异,但对于任何一个CLR,其他类型的所有实例都具有相同的大小-字符串和数组因内容而异。)
- 如果反复调用
,每次都会得到相同的引用newstring(newchar[0])
- 它以神奇的方式与互操作封送员交互:)
类的作者确定类的实例是否是不可变的 这是另一个不可变的类:(引用类型,而不是值类型)
至少还有一个,
DateTime
也是一个不可变对象…@jball:DateTime是一个值类型而不是引用类型。您通常也定义自己的不可变引用类型:)因此,字符串一点也不特殊,它只是没有设置程序来更改值。@cesar,我在回答问题的一部分:它是唯一具有这种不变行为的对象吗?更正,所有ValueType也是对象,因为ValueType派生自object。当然,字符串不是从ValueType派生的。至少还有一个,DateTime
也是一个不可变的对象…@jball:DateTime是一个值类型而不是引用类型。您通常也定义自己的不可变引用类型:)因此,字符串一点也不特殊,它只是没有设置程序来更改值。@cesar,我在回答问题的一部分:它是唯一具有这种不变行为的对象吗?更正,所有ValueType也是对象,因为ValueType派生自object。当然,字符串不是从ValueType派生的。不,它像复制其他引用类型一样复制引用。@Jon:但是如果我复制字符串a=“Hello”;字符串b=a;那么,对a的任何更改都不会被b“看到”。这不意味着字符串的内容是在赋值时复制的吗?@Cesargo,不,这意味着所有字符串都是不可变的-因此,不可能更改a。@Jon,@hemp:我现在看到了。感谢两者的澄清。a和b不包含字符串“Hello”。它们包含数字68324,这是字符串所在的内存位置。如果您随后写入a=“Bob”
,则a的值为68700,而b仍然等于68324。不,它会像其他引用类型一样复制引用。@Jon:但如果我写入字符串a=“Hello”;字符串b=a;那么,对a的任何更改都不会被b“看到”。这不意味着字符串的内容是在赋值时复制的吗?@Cesargo,不,这意味着所有字符串都是不可变的-因此,不可能更改a。@Jon,@hemp:我现在看到了。感谢两者的澄清。a和b不包含字符串“Hello”。它们包含数字68324,这是字符串所在的内存位置。如果你写