C string 特殊的引用型別

2021-06-25 11:59:44 字數 3264 閱讀 2525

.net 框架程式設計(修訂版)中有這樣一段描述:string型別直接繼承自object,這使得它成為乙個引用型別,也就是說執行緒上的堆疊上不會駐留有任何字串。(譯註:注意這裡的「直接繼承」。直接繼承自object的型別一定是引用型別,因為所有的值型別都繼承自system.valuetype。值得指出的是system.valuetype卻是乙個引用型別)。

一:

string

str1 ="

string";

string

str2 ="

string"; 

console.writeline(

string

.referenceequals(str1, str2));

既然string型別是引用型別,那麼**一輸出的應該是false,然而事實上**一輸出時的是true。

其實這是string型別的自動優化功能。str1,str2引用同一物件,節省記憶體,並不會為str2單獨開闢記憶體空間。clr使用了一種叫字串駐留的技術,當clr初始化時,會建立乙個內部的雜湊表,其中的鍵為字串,值為指向託管堆中字串的引用。剛開始,雜湊表為空,jit編譯器編譯方法時,會在雜湊表中查詢每乙個文字常量字串,首先會查詢"abc"字串,並且因為沒有找到,編譯器會在託管堆中構造乙個新的指向"abc"的string物件引用,然後將"abc"字串和指向該物件的引用新增到雜湊表中。接著,在雜湊表中查詢第二個"abc",這一次由於找到了該字串,指向同乙個string物件的引用會被儲存在變數str2中,到此str1和str2指向了同乙個引用,所以string.referenceequals(str1, str2)就會返回true了。

另外,c#中是不允許用new操作符建立string物件的,編譯器會報錯。 二:

static

void

main(

string

args)  

static

void

change(

string

str)

方法傳遞的引數是原內容的拷貝,其過程如果用圖可表示為:

語句str=」changed」之前

語句str=」changed」之後

這樣可以看到原來string物件並未改變str=」changed」只是建立乙個新的string物件(其它引用型別是改變記憶體位址1指向的值),因此這個方法的引數需要加上ref或者out修飾符。因此這裡也可以得出字串具有恒等性,也就是說乙個字串一旦被建立,我們就不能再將其變長、變短、或者改變其中的任何字元。

msdn上這樣解釋:字串物件是不可變的,即它們一旦建立就無法更改。對字串進行操作的方法實際上返回的是新的字串物件。

string在另一種情況下的操作是具有值型別特徵的:str1 == str2 ,僅僅是比較了值,而非位址(是ms重寫了==運算子所致).

三:string 物件是不可改變的。每次使用 system.string 類中的方法之一時,都要在記憶體中建立乙個新的字串物件,這就需要為該新物件分配新的空間。在需要對字串執行重複修改的情況下,與建立新的 string 物件相關的系統開銷可能會非常昂貴。如果要修改字串而不建立新的物件,則可以使用 system.text.stringbuilder 類。例如,當在乙個迴圈中將許多字串連線在一起時,使用 stringbuilder 類可以提公升效能。

下面看乙個極簡單的例子:

namespace

tcp          

public

string

name

set          }

public

string

age          

set          }

} }

public

static

void

edituser(user user, stringbuilder str,

string

code)

static

void

main(

string

args)

}

上面**輸如下:

這樣可以看到原來string物件並未改變str=」changed」只是建立乙個新的string物件(其它引用型別是改變記憶體位址1指向的值),因此這個方法的引數需要加上ref或者out修飾符。因此這裡也可以得出字串具有恒等性,也就是說乙個字串一旦被建立,我們就不能再將其變長、變短、或者改變其中的任何字元。

msdn上這樣解釋:字串物件是不可變的,即它們一旦建立就無法更改。對字串進行操作的方法實際上返回的是新的字串物件。

string在另一種情況下的操作是具有值型別特徵的:str1 == str2 ,僅僅是比較了值,而非位址(是ms重寫了==運算子所致).

三:string 物件是不可改變的。每次使用 system.string 類中的方法之一時,都要在記憶體中建立乙個新的字串物件,這就需要為該新物件分配新的空間。在需要對字串執行重複修改的情況下,與建立新的 string 物件相關的系統開銷可能會非常昂貴。如果要修改字串而不建立新的物件,則可以使用 system.text.stringbuilder 類。例如,當在乙個迴圈中將許多字串連線在一起時,使用 stringbuilder 類可以提公升效能。

下面看乙個極簡單的例子:

namespace

tcp          

public

string

name

set          }

public

string

age          

set          }

} }

public

static

void

edituser(user user, stringbuilder str,

string

code)

static

void

main(

string

args)

}

上面**輸如下:

從上面可以看到string型別的值並沒有改變,stringbuilder與class的值都改變了。

C string 特殊引用型別

c 有string關鍵字,在翻譯成.net類時,它就是system.string.有了它,像字串連線和字串複製這樣的操作就簡單了.1 string 是引用型別還是值型別 引用型別操作 當使用過載操作符 給string物件賦值時,string的物件是引用型別,它保留在堆上,而不是堆疊上.因此,當把乙個...

C string型別(引用型別)

c string型別 引用型別 2016年03月31日 10 34 45 閱讀數 966 名稱 cts型別 說明string system.string unicode字串 string str1 hello string str2 world 這是乙個值型別的賦值,但string是乙個引用型別。s...

string是特殊的引用型別,特殊在何處

對於string這個引用型別是非常特殊乙個引用型別。它有兩點特殊的地方。第一點物件分配的特殊。例如 string str1 abcd string str2 abcd 那麼.net在分配string型別的時候,先檢視當前string型別列表是否有相同的,如果有的話,直接返回其的引用,否則重新分配。第...