Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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
C# 字符串如何存储在对象数组中?_C#_Arrays_String_Object - Fatal编程技术网

C# 字符串如何存储在对象数组中?

C# 字符串如何存储在对象数组中?,c#,arrays,string,object,C#,Arrays,String,Object,字符串是否作为字符串对象的引用存储在数组中 object[] objs = new object[]{"one","two","three"}; 或者字符串对象是否存储在数组元素中 [@] - one [@] - two [@] - three 谢谢 编辑:对不起,我的图表失败得很惨。它们作为引用存储在内部。将存储该字符串的副本,并且在使用该字符串的任何位置,都有对同一存储字符串的引用。(这是字符串不可变的许多原因之一;否则,修改字符串的一个实例将修改它出现的任何地方)字符串对象永远不能直接

字符串是否作为字符串对象的引用存储在数组中

object[] objs = new object[]{"one","two","three"};
或者字符串对象是否存储在数组元素中

[@] - one
[@] - two
[@] - three
谢谢


编辑:对不起,我的图表失败得很惨。

它们作为引用存储在内部。将存储该字符串的副本,并且在使用该字符串的任何位置,都有对同一存储字符串的引用。(这是字符串不可变的许多原因之一;否则,修改字符串的一个实例将修改它出现的任何地方)

字符串对象永远不能直接存储在数组中,也不能作为任何其他变量存储。它始终是引用,即使是在以下简单情况下:

[one][two][three]

这里,
x
的值是一个参考,而不是一个对象。没有表达式值是对象-它始终是引用、值类型值或指针。

所有基元类型都直接存储到数组中,但所有其他对象或引用类型都存储为内存引用。对于所有不限于字符串的对象来说,这是正确的。

< P>乔恩Skeste非常好地描述了实际的实现,但是让我们考虑为什么CLR将字符串直接存储在数组中是无稽之谈。< /P> 第一个原因是直接在数组中存储字符串会损害性能。如果字符串直接存储在数组中,那么要到达数组的元素1000,CLR必须遍历数组中所有字符串的字节,直到到达元素1000,同时检查字符串边界。由于字符串和任何其他引用类型都作为引用存储在数组中,因此查找数组的正确元素需要一次乘法、一次加法和一个指针(这里指针的概念是在实现级别,而不是程序员可见级别)。这将产生更好的性能

字符串不能直接存储在数组中的第二个原因是。假设字符串直接存储在使用生成的数组中

string x = "foo";
然后,将其强制转换为对象数组,这是合法的

string[] strings = new string[] {"one", "two", "three"};

编译器应该如何生成考虑到这种可能性的代码?将对象数组作为参数的方法可以向其传递字符串数组,因此CLR需要知道是作为对象数组、字符串数组还是其他类型的数组索引到数组中。不知何故,在运行时,每个数组都必须用数组的类型声明进行标记,每个数组访问都必须检查类型声明,然后根据数组的类型以不同的方式遍历数组。坚持使用引用要简单得多,它允许单个阵列访问实现并提高引导性能。

感谢您的更正。我正在编辑过程中。只是想澄清一下:objs是对堆上数组的引用,元素是对堆上字符串对象的引用,对吗?你现在有点让我不知所措,但我以后会保存。谢谢
object[] objs = (object[])strings;