当前位置: 首页 > 编程语言 > C#

为什么字符串是引用类型?分享

时间:2023-04-10 21:52:41 C#

为什么字符串是引用类型?为什么字符串是引用类型,即使它通常是原始数据类型,如int、float或double。哎呀,这个答案被接受了,然后我改变了它。我应该在底部包含原始答案,因为那是OP接受的内容。新答案更新:事情是这样的。字符串肯定需要像引用类型。到目前为止所有的答案都谈到了这个原因:字符串类型没有常量大小,将字符串的全部内容从一种方法复制到另一种方法是没有意义的,否则string[]数组必须是根据主题调整大小-仅举几例。但是您仍然可以将字符串定义为一个内部指向char[]数组的结构,或者甚至是一个以int作为长度的char*指针,使其不可变,瞧!,您有一个行为类似于引用类型但在技术上是值类型的类型。老实说,这看起来很傻。正如EricLippert在其他答案的一些评论中指出的那样,定义这样的值类型基本上与定义引用类型相同。在几乎所有意义上,它都与以相同方式定义的引用类型没有区别。然后是“为什么字符串是引用类型?”这个问题的答案。基本上是:“让它成为一种价值类型是愚蠢的。”但如果这是唯一的原因,那么真正合乎逻辑的结论是实际上上面的字符串可以定义为上面的结构,并且没有特别好的论据支持该选择。然而,有理由认为将字符串作为类而不是纯粹的智能结构更好。这是我能想到的几个:防止装箱如果字符串是值类型,那么每次将它传递给方法时,都必须对其进行装箱,这会产生一个新对象,这会使堆膨胀并导致毫无意义的GC压力。由于琴弦基本上无处不在,让它们一直敲击将是一件大事。对于直观的相等比较是的,string无论是引用类型还是值类型都可以覆盖Equals。但是如果是值类型,那么ReferenceEquals("a","a")就会返回false!这是因为两个参数都将被装箱,而装箱的参数永远不会有相同的引用(据我所知)。因此,即使您可以定义一个值类型来充当引用类型,由一个引用类型字段组成,但它仍然不完全相同。所以我认为它更完整,因为字符串是引用类型:您可以将其设为值类型,但这只会引入不必要的弱点。原始答案它是一个引用类型,因为只传递对它的引用。如果它是值类型,那么每次将字符串从一种方法传递到另一种方法时,整个字符串都会被复制*。因为它是引用类型,而不是像“Helloworld!”这样的字符串值。传递-“Helloworld!”顺便说一句,它是12个字符,这意味着它需要(至少)24个字节的存储空间——只是传递对这些字符串的引用。通过引用传递比传递字符串中的每个字符便宜得多。此外,它实际上不是普通的原始数据类型。谁告诉你的?*实际上,它并不严格。如果字符串内部包含一个char[]数组,那么只要数组类型是引用类型,字符串的内容实际上并不是按值传递的——只有对数组的引用是。但是,我仍然认为这基本上是正确的答案。除了Dan发布的原因:根据定义,值类型是那些在自身内部存储值的类型,而不是引用其他地方的值。这就是为什么值类型被称为“值类型”而引用类型被称为“引用类型”的原因。所以你的问题真的是“为什么一个字符串引用它的内容而不是简单地包含它的内容?”这是因为值类型具有很好的属性,即给定值类型的每个实例在内存中都具有相同的大小。所以呢?为什么这是一个不错的属性?好吧,假设字符串是可以具有任意大小的值类型,请考虑以下内容:string[]mystrings=newstring[3];三个字符串数组的初始内容是什么?值类型没有“null”,所以唯一明智的做法是创建一个包含三个空字符串的数组。它将如何在内存中列出?想一想。你会怎么做?现在假设你说string[]mystrings=newstring[3];mystrings[1]="你好";现在数组中有“”、“hello”和“”。内存“你好”去哪儿了?分配给mystrings[1]的插槽有多大?数组及其元素的内存必须在某个地方。这给CLR留下了以下选择:CLR团队选择了后者。将字符串转换为引用类型意味着您可以高效地创建它们的数组。字符串是引用类型,不是值类型。在很多情况下,你知道字符串的长度和字符串的内容,在这种情况下很容易为字符串分配内存。但是考虑这样的事情。字符串s=Console.ReadLine();在编译时不可能知道“s”的分配细节。用户输入值,所有输入的字符串/行都存储在s中。因此,将字符串存储在堆上,以便重新分配内存以适应字符串的内容。并且对该字符串的引用存储在堆栈中。要了解更多信息,请阅读:petzold的.netzero阅读:通过C#从CLR收集垃圾,了解堆栈的分配详细信息。编辑:Console.WriteLine();到Console.ReadLine();以上就是C#学习教程:为什么字符串是引用类型?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: