2011-06-09 63 views
18

在閱讀What's the rationale for null terminated strings?和一些類似的問題之後,我發現在C#/ .net字符串中,內部都有長度前綴和空終止,如BSTR Data Type爲什麼C#/ .Net字符串長度前綴和空終止?

什麼原因字符串都是長度前綴和空終止,而不是例如。只有長度前綴?

+2

也許只有@Eric Lippert才能夠回答這個問題。做一個或另一個有很好的理由(以及折衷方案)。我感到很驚訝,因爲C#可以兼得**。 – Yuck 2011-06-09 13:32:05

+1

@Yuck - 或Jon Skeet – Xaisoft 2011-06-09 13:34:29

回答

21

長度的前綴使計算長度爲O(1)

Null終止,使封送處理非快速封鎖(非託管可能期望以空字符結尾的字符串)。

4

最有可能的是確保與COM的輕鬆互操作性。

13

下面是喬恩斯基特的博客Post關於字符串的摘錄:

雖然字符串不是空終止至於API而言,字符數組是空值終止的,因爲這意味着它可以直接傳遞給非託管函數而不涉及任何複製,假設inter-op指定該字符串應該編碼爲Unicode。

0

最好的猜測是找到的長度是恆定的(O(1))與遍歷它相比,在O(n)中運行。

+0

這就是在字符串前加上長度的原因。這不是額外使用終止字符的原因 – 2011-06-09 13:35:29

+1

@Daniel Hilgarth:爲什麼我沒有複製其他答案。這個問題提出了雙方的推理。 – leppie 2011-06-09 13:36:25

+1

對不起,我不明白你的評論 - 再來一次?問題是什麼是合理使用**的理由**。而不是自己的推理是什麼 – 2011-06-09 13:37:15

3

雖然長度字段使框架很容易確定字符串的長度(並且它允許字符串包含零值的字符),但框架(或用戶程序)需要的東西非常多處理那些期望NULL結束的字符串。例如,像Win32 API一樣,

因此,在字符串數據的末尾保留一個NULL終止符是很方便的,因爲它可能需要經常出現在那裏。

請注意,C++的std::string類以相同的方式實現(無論如何MSVC)。出於同樣的原因,我相信(c_str()通常用於將std::string傳遞給需要C風格字符串的東西)。