string引用型別解惑

2021-09-06 16:30:17 字數 926 閱讀 2166

先上**:

string b = "123";

private void form1_load(objectsender, eventargs e) public void test(stringa )

string是引用型別的,應該按引用傳遞, 輸出結果應該是:456,正確答案卻是:123

string繼承自object,而不是system.valuetype(int32這樣的則是繼承於system.valuetype) 。string是引用型別,毋庸置疑,但是這個特殊的類卻表現出值型別的特點. 

why?搜網上原文如下:string有個顯著的特點就是它的不變性,我們一旦建立了乙個string,在managed heap 上為他分配了一塊連續的記憶體空間,我們將不能以任何方式對這個string進行修改使之變長、變短、改變格式。所有對這個string進行各項操作(比如呼叫toupper獲得大寫格式的string)而返回的string,實際上另乙個重新建立的string,其本身並不會產生任何變化。 string   物件稱為不可變的(唯讀),因為一旦建立了該物件,就不能修改該物件的值。有的時候看來似乎修改了,實際是string經過了特殊處理,每次改變值時都會建立乙個新的string物件,變數會指向這個新的物件,而原來的還是指向原來的物件,所以不會改變。這也是string效率低下的原因。

string的不變,並非說string不能改變,而是其值不能改變。當b="123"其值發生改變時,這時檢查記憶體,發現不存在此字串,則重新分配記憶體空間,儲存「456」,分配a的記憶體位址,a是區域性的,稍後gc會自動釋放,而b依然指向「123」的位址。

string 還有個特殊地方,就是它記憶體分配的問題,在例子中b="123",這時在記憶體中就將「123」存下來,假如如果再建立字串物件,其值也等於「123」,c="123",則並非再重新分配記憶體空間,而是將之前儲存的「123」的位址賦給c的引用。

C 解惑 值型別和引用型別

值型別將資料和記憶體都儲存在同一位置,而乙個引用型別則會有乙個指向實際記憶體區域的指標。通過下圖,我們可以看到乙個名為i的整形資料型別,它的值被賦值到另乙個名為j的整形資料型別。他們的值都被儲存到了棧上。當我們將乙個int型別的值賦值到另乙個int型別的值時,它實際上是建立了乙個完全不同的副本。換句...

筆記 引用型別 String型別

string 型別是字串包裝型別 var str new string hello world 這是乙個特殊的物件型別與引用型別不同的是它的生命週期,它的生命週期在 執行完瞬間就會被銷毀 sring型別的例項都有乙個length 屬性 可以str.length 訪問 1.字元方法 charat ch...

string 引用 值型別

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