Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net中的值类型-字符串是单独的类型吗?_.net - Fatal编程技术网

.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,这是字符串所在的内存位置。如果你写