我想知道String.Length
如何计算字符数。
如果可能的话,一个简单的算法就可以很好地解释它。
答案 0 :(得分:12)
没有。字符数存储为字段(m_stringLength
,如果重要的话); .Length
只返回此值。在.NET中,字符串通常不是nul-terminated或类似的。更有趣的问题是“存储字符串数据的位置” - 这很复杂; string
类型是通常规则的例外,对象本身具有可变大小;字符数据直接位于string
对象内(string
类型不具有指向字符数据的指针或引用; 字符数据,加上一个长度字段)。
答案 1 :(得分:1)
在二进制系统中实现字符串有两种常用方法:
对于第一种方法,您可以将数字从内存中取出并返回。第二种方法需要计数,直到遇到特殊字符(NULL)。
答案 2 :(得分:1)
SystemString.Length
不计算字符数,它存储长度。
存储字符串有两种常用方法 - 字符+长度,字符+终结符。在.NET中使用第一种方法;在其他语言中,例如C,使用第二种方法。
答案 3 :(得分:0)
在.NET内部字符串存储为NULL终止字符数组,其中包含额外的元数据,如长度以及字符串是否包含任何特殊字符。因为字符串是不可变的,所以从操作创建的新字符串(例如:连接)具有更新的长度。
http://csharpindepth.com/Articles/General/Strings.aspx
这是一个基本的字符串长度函数,如果你有一个空终止的字符数组,并且你想找到它的长度。
编辑澄清一下,字符数组CAN包含null或\ 0字符,但是当您将该数组表示为空终止字符串时,该字符串将以它到达的第一个空值结束。另一点是.NET中的字符是UTF-16,但是“通常”在引用空终止字符串时,您将处理ASCII(每个字符1个8位字节),对于下面的示例,我将使用byte []数组代替char []数组来澄清那个。
long length = 0;
foreach(var ch in byteArray) {
if(ch == 0) break;
length++;
}