C#-字符串实际上是一个字符数组还是只是一个索引器?由于以下代码在C#中有效,我想知道字符串是否实际上是一个字符数组:stringa="TEST";字符C=a[0];//将是TSystem.String不是Char的.NET数组,因为:char[]testArray="test".ToCharArray();testArray[0]='T';会编译,但是这样:stringtestString="test";testString[0]='T';不会。字符串数组是可变的,而字符串不是。另外,stringisArray返回false,而char[]isArray返回true。不,它不是数组。但它确实有一个索引器。两全其美的。.NET中的字符串由System.String类支持,该类在内部使用一堆不安全的方法来使用标准C内存操作技术对实际字符串数据进行指针操作。String类本身不包含数组,但它有一个索引器属性,允许您将数据视为数组。不,String是.Net中的一个类。它可以由数组支持。但它不是一个数组。类可以有索引器,这就是String所做的。请参阅此语句的详细解释:据我了解,所有字符串都存储在一个公共blob中。所以“foo”和“foo”指向该blob中的同一点......字符串在C#中不可变的原因之一。string不是char[],尽管它有一个.ToCharArray()。它还有一个索引器,允许您单独访问字符,就像您所显示的那样。它可能在内部使用数组实现,但这是一个实现细节。字符串对象包含连续的字符块,如字符数组,但字符串对象既不是也不包含数组对象。编译器知道字符串是不可变的,因此它可以在访问字符串时以与访问数组时优化相同的方式执行某些优化。因此,当您通过索引访问字符串时,您的代码最终可能会直接访问字符串数据,而不是调用索引器属性。为ScottDorman和Gufa的回答添加一点内容。如果您在字符串'abcd'上使用Windbg和!DumpObject,你会得到这样的东西。0:000>!do01139b24名称:System.StringMethodTable:79330a00EEClass:790ed64c大小:26(0x1a)字节(C:WINDOWSassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)字符串:abcd字段:MTc9Atc7Valuer3Value3类型VT40000964System.Int321instance5m_arrayLength79332c4c40000978System.Int321instance4m_stringLength793316e04000098cSystem.Char1instance61m_firstChar79330a00400009910System.String0sharedstaticEmpty>>Domain:Value00181b38:01131198>Domain:值00181b38:011318b8您会注意到它只有三个实例字段。m_arrayLength、m_stringLength和m_firstChar。它不包含实例System.Char[]其他2个字段是静态共享的,因此每个System.String都有相同的空字符串数组和WhitespaceChar字符。如果您使用DumpByte,您将在堆中看到字符串数据(本例中为abcd),当然从偏移量0x0c(m_firstChar)开始,宽度为8个字节(对于unicode,m_stringLength为4x2)。0:000>db01139b24L1A01139b24000a337905000000-0400000061006200..3y..ab01139b346300640000000000c...0000..如果您查看SSCLI,您会发现,正如Scott所说,它运行不安全代码并使用指针技术通过m_firstChar和m_stringLength读取数据。String是一个使用char数组来初始化自身的类,所以当你试图获取某个索引处的元素时,它返回的是char。检查字符串类publicsealedclassString:IComparable,ICloneable,IConvertible,IComparable,IEnumerable,IEnumerable,IEquatable{//摘要://将System.String类的新实例初始化为Unicode数组指示的值//人物。////参数://值://Unicode字符数组。[SecuritySafeCritical]publicString(char[]值);}另见String类声明。publicsealedclassString:IComparable,ICloneable,IConvertible,IComparable,IEnumerable,IEnumerable,IEquatable由IEnumerable继承。在字符串类中有一个get属性,它在传递索引时返回char,请参见图像。这清楚地表明,获取当前System.String中指定位置的System.Char对象publiccharthis[intindex]{get;}正在将字符串转换为字符串而不是char数组。此表示法仅用于访问字符串中不同位置(索引)的字符。使用Reflector,我们可以看到字符串确实实现了IEnumerable。所以,它不是一个字符数组,但本质上可以像一个字符数组一样使用。publicsealedclassString:IComparable,ICloneable,IConvertible,IComparable,IEnumerable,IEnumerable,IEquatable编辑:实施IEnumerable并不意味着该类型将被索引。我不是要传达这个。这意味着您可以枚举它并像使用集合一样使用它。我要说的更好的方法是字符串不是字符数组,而是字符集合。谢谢你的评论。字符串根本不是数组,因为“Hello”是char[],其计算结果为false。每个人都给出了一半的答案,所以这里分为两部分:1)严格来说,是的,.NET中的String是一个字符数组。在其内部实现和数组的语义定义中都是如此。2)然而,正如其他人所指出的,字符串有点奇怪。对于所有其他数组,它不是System.Array。因此,在严格的.NET特定方式中,String不是数组。以上就是C#学习教程:C#——字符串到底是字符数组还是索引器?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
