字符串實際上是一個字符數組(is-a),還是它有一個字符數組作爲內部存儲(has-a),還是它自己的對象可以將自己暴露爲一個字符數組?什麼是.NET中的字符串?
我更傾向於說它是它自己的對象,但爲什麼我們總是這麼說「一個字符串是一組字符......」?
字符串實際上是一個字符數組(is-a),還是它有一個字符數組作爲內部存儲(has-a),還是它自己的對象可以將自己暴露爲一個字符數組?什麼是.NET中的字符串?
我更傾向於說它是它自己的對象,但爲什麼我們總是這麼說「一個字符串是一組字符......」?
.NET字符串不僅僅是一個字符數組。它包含一系列字符,嚴格來說,它具有-a。
此外,還有很多Unicode相關的細微之處,它不像行爲像數組一樣。連接一個字符可能會做的不僅僅是將字符串長度增加1,並且在結尾處插入新字符。根據Unicode規範化規則,它實際上可能會更改整個字符串。所以它是絕對沒有像一個字符數組,但在類的某個地方,這樣的數組存在。
MSDN:字符串類型表示一個Unicode字符的字符串。
這意味着:它是一個Unicode字符數組。
字符串的語義是第二個。
.Net String類維護着一個內部存儲(has-a),並且可以按照設計人員選擇的多種抽象方式公開該存儲。
問題就像「蘋果是紅色的圓形的東西嗎?因爲我一直認爲這是一個水果。」
以一種抽象的方式(我想,當在內存中放置時) - 它是一個字符數組。
糾正我,如果我錯了以爲。
這取決於你對單詞「string」的定義。
System.String
.NET中的類型有一個字符數組作爲內部存儲(例如,它也存儲了長度(它是O(1)))。
但這個詞串指一般的東西連續發生,這可能也意味着一個字符數組:))
順便說一句,我說string
類型都有一個「字符數組,」我沒有」 t具體指「char[]
」字段。我的意思是「數組」這個術語的一般含義是有序的一些東西。 :))
字符串是一個類的名稱。它在不同的語言中有不同的含義。它可能是unicode或ASCII內部的意思,它的存儲機制是一系列字節。這個類提供了操作它自己的內部存儲器的函數,並且它不能被直接訪問和修改,因爲它可以包含各種不同編碼中的字符。因此,爲了您的問題,它有一個字節存儲。
這取決於語言和實施。在最基本的級別上(ascii char * string),它是一系列連續的內存地址,每個地址都包含一個對應於ascii代碼的short int,並以null(char(0))結尾。大多數高級語言提供了一個字符串對象,其中有一個字符數組以及便捷方法,因爲使用char *字符串或多或少是後面的痛苦。
取決於你究竟如何看待它。如果你用一個GCHandle來定位它,然後查看它駐留的內存,你會發現它實際上是一個32位長度的描述符,緊接着是一個unicode字符數組(注意AddrOfPinnedObject會給你第一個地址字符,不是的長度,如果它給出了長度的地址,它對P/Invoking的用處就會小得多)。
功能上,字符串是字符的列表或序列。字符串通常以字符數組的形式透明地存儲(例如,在C中),所以我們經常以這種方式來引用它們。數組允許方便地隨機訪問字符,這對於某些算法很重要。
但是,爲了其他目的,將Unicode字符串存儲爲UTF-8可能是最合適的形式。請注意,儘管存儲在字節數組中,但字節和字符之間不再存在一對一的對應關係:字符串算法通常需要從頭開始按順序訪問字符 - 作爲列表。
這個故事的寓意是:你的字符串代碼應該只需要隨機訪問,如果它真的需要它。你可能很驚訝你很少需要一組字符。
你爲什麼問?好奇心?你面臨的一些問題? – 2008-12-10 19:56:21
一個神奇的網絡麻線蘸了一個gooy陣列的人物。 – Echostorm 2008-12-10 20:03:58
請編輯提到.NET的問題。我根據問題標籤回答。 – 2008-12-10 20:11:15