在閱讀What's the rationale for null terminated strings?和一些類似的問題之後,我發現在C#/ .net字符串中,內部都有長度前綴和空終止,如BSTR Data Type。爲什麼C#/ .Net字符串長度前綴和空終止?
什麼原因字符串都是長度前綴和空終止,而不是例如。只有長度前綴?
在閱讀What's the rationale for null terminated strings?和一些類似的問題之後,我發現在C#/ .net字符串中,內部都有長度前綴和空終止,如BSTR Data Type。爲什麼C#/ .Net字符串長度前綴和空終止?
什麼原因字符串都是長度前綴和空終止,而不是例如。只有長度前綴?
長度的前綴使計算長度爲O(1)
。
Null終止,使封送處理非快速封鎖(非託管可能期望以空字符結尾的字符串)。
最有可能的是確保與COM的輕鬆互操作性。
下面是喬恩斯基特的博客Post關於字符串的摘錄:
雖然字符串不是空終止至於API而言,字符數組是空值終止的,因爲這意味着它可以直接傳遞給非託管函數而不涉及任何複製,假設inter-op指定該字符串應該編碼爲Unicode。
最好的猜測是找到的長度是恆定的(O(1))與遍歷它相比,在O(n)中運行。
這就是在字符串前加上長度的原因。這不是額外使用終止字符的原因 – 2011-06-09 13:35:29
@Daniel Hilgarth:爲什麼我沒有複製其他答案。這個問題提出了雙方的推理。 – leppie 2011-06-09 13:36:25
對不起,我不明白你的評論 - 再來一次?問題是什麼是合理使用**的理由**。而不是自己的推理是什麼 – 2011-06-09 13:37:15
雖然長度字段使框架很容易確定字符串的長度(並且它允許字符串包含零值的字符),但框架(或用戶程序)需要的東西非常多處理那些期望NULL結束的字符串。例如,像Win32 API一樣,
因此,在字符串數據的末尾保留一個NULL終止符是很方便的,因爲它可能需要經常出現在那裏。
請注意,C++的std::string
類以相同的方式實現(無論如何MSVC)。出於同樣的原因,我相信(c_str()
通常用於將std::string
傳遞給需要C風格字符串的東西)。
也許只有@Eric Lippert才能夠回答這個問題。做一個或另一個有很好的理由(以及折衷方案)。我感到很驚訝,因爲C#可以兼得**。 – Yuck 2011-06-09 13:32:05
@Yuck - 或Jon Skeet – Xaisoft 2011-06-09 13:34:29