C#如何在无空终止符的情况下确定字符串的结尾与长度?
C#如何在无空终止符的情况下确定字符串的结尾与长度?
嗨,这个问题太戳中从C/C++转C#的新手痛点了——我当初刚摸C#的时候,也对着字符串里的\0犯嘀咕:这玩意儿怎么不按C那套截断字符串啊?
其实核心逻辑很简单:C#里的string对应.NET的System.String类型,它可不是单纯的字符数组,而是一个自带元数据的引用类型。
它的内部结构里直接存着一个整数类型的长度字段——就像给字符串自带了个“身份卡”,明明白白告诉CLR这个字符串有多少个字符。所以当你调用sample.Length的时候,根本不用像C/C++那样遍历字符找\0,直接读这个预存的长度值就行,效率还更高。
再看你给出的例子:
string sample = "Hello\0World"; Console.WriteLine(sample); // Output: Hello\0World Console.WriteLine(sample.Length); // Output: 11
这里的\0在C#里就是个普通的Unicode控制字符(U+0000),和'a'、'b'没本质区别——字符串会把它正常存入字符序列,算长度的时候也会把它算进去(5个Hello字符 + 1个\0 + 5个World字符,正好11)。Console.WriteLine输出时,也会严格按照内部记录的长度遍历所有字符,自然不会在\0的地方截断。
顺带提一句:如果要和非托管的C/C++代码交互,把C风格的空终止字符串转成C#字符串时,CLR也支持通过指定长度的方式,把包含\0的完整内容转过来,完全不受空终止符的限制。
内容来源于stack exchange
相关产品推荐
相关产品推荐

