0

当我应用 IEnumerator 并执行 MoverNext() 时,它会像 C-Style 一样遍历 'a' 'p' 'p' 'l' 'e' '\o' 直到找到空字符吗?我认为它会返回整个字符串。枚举在这里如何工作?

    string ar = "apple";

    IEnumerator enu = ar.GetEnumerator();

    while (enu.MoveNext())
    {

        Console.WriteLine(enu.Current);
    }

我得到输出

a
p
p
l
e
4

4 回答 4

8

字符串在 C# 中不是以空值结尾的。或者更确切地说,字符串以空值结尾的事实是对用户隐藏的实现细节。字符串“apple”有五个字符,而不是六个。您要求查看这五个字符,我们将它们全部展示给您。没有第六个空字符。

于 2009-10-20T17:47:53.780 回答
3

空字符不是 CLR / .Net 字符串的固有部分,因此不会出现在枚举中。枚举字符串会按顺序返回字符串的字符

于 2009-10-20T17:46:29.160 回答
2

C# 字符串的存储方式类似于 COM 字符串、长度字段和 unicode 字符列表。因此不需要终结器。它使用更多内存(多 2 个字节),但字符串本身可以保存空值而不会出现任何问题。

另一种解析使用与代码相同功能的字符串的方法更像 C#:

string s="...";
foreach(char c in s)
  Console.WriteLine(c);
于 2009-10-20T17:50:32.083 回答
2

MoveNext()枚举器在每次迭代(调用)时返回底层容器的每个元素。在这种情况下,您的容器是 astring并且其元素类型是char,因此枚举器将在每次迭代时返回一个字符。

此外,字符串的长度由string类型知道,枚举器实现可以利用它来知道何时终止其遍历。

于 2009-10-20T17:48:20.077 回答