c# - 为什么字符串是引用类型?

标签 c# string primitive-types reference-type

为什么字符串是引用类型,即使它通常是原始数据类型,例如 int、float 或 double。

最佳答案

除了Dan贴出来的原因:

根据定义,值类型是将其值存储在自身中的类型,而不是引用其他地方的值。这就是为什么值类型被称为“值类型”而引用类型被称为“引用类型”的原因。所以你的问题实际上是“为什么一个字符串引用它的内容而不是简单地包含它的内容?”

这是因为值类型具有很好的属性,即给定值类型的每个实例在内存中的大小都相同。

那又怎样?为什么这是一个不错的属性?好吧,假设字符串是可以具有任意大小的值类型并考虑以下内容:

string[] mystrings = new string[3];

三个字符串数组的初始内容是什么?值类型没有“null”,所以唯一明智的做法是创建一个包含三个空字符串的数组。那将如何在内存中布局?想一想。你会怎么做?

现在假设你说

string[] mystrings = new string[3];
mystrings[1] = "hello";

现在数组中有“”、“hello”和“”。 “hello”在内存中的什么位置?无论如何,分配给 mystrings[1] 的插槽有多大?数组及其元素的内存必须某处

这给 CLR 留下了以下选择:

  • 每次更改其中一个元素时调整数组,复制整个元素,其大小可能为兆字节
  • 不允许创建大小未知的值类型数组
  • 不允许创建大小未知的值类型

CLR 团队选择了后者。 将字符串变成引用类型意味着您可以高效地创建它们的数组。

关于c# - 为什么字符串是引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655984/

相关文章:

c# - 允许您隐式地将 List<ChildClass> 视为 List<ParentClass> 的 C# 功能的名称是什么

c - C中字符串数组的重新分配和新字符串的分配

c++ - 枚举的段错误

java - 对于 Java 中的按位运算,我是否需要关心 Java 中的大多数数字类型是否已签名?

c++ - 存储非负浮点值

c# - SendEmail 方法不起作用

c# - 弹出窗口显示一次但不会在动画 WPF 中再次显示

kotlin - Kotlin 有原始类型吗?

c# - 将 LocalDB 与 Service Fabric 结合使用

java - 如何使用正则表达式或其他技术解析该字符串?