string 引用 值型別

2022-05-02 06:51:13 字數 1715 閱讀 3183

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

**一:

string str1 = "string"; string str2 = "string"; console.writeline(string.referenceequals(str1, str2));

既然string型別是引用型別,那麼**一輸出的應該是false,然而事實上**一輸出時的是true。這是因為當clr初始化的時,它會建立乙個內部的雜湊表,key為字串,value為指向託管堆中字串物件的引用。當構造str1時,先會去雜湊表中查詢是否存在」string」字串,如果不存在那麼會在託管堆中構造乙個新的string物件,然後將」string」字串和指向該物件的引用新增到雜湊表中,當構造str2時,由於雜湊表中存在key為」string」的引用,於是將value值賦值給str2,那麼str1和str2引用的是同乙個string物件,**一自然就返回true了

**二:

static void main(string args) static void change(string str)

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

語句str=」changed」之前

語句str=」changed」之後

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

**三:

string str1 = "string"; string str2 = "system." + "string"; string str3 = "system." + str1; console.writeline(string.equals(str3, str2));console.writeline(string.referenceequals(str2, str3)); string str4 = "system.string"; console.writeline(string.equals(str4, str2));console.writeline(string.referenceequals(str2, str4));

根據**一和二的分析,**三的輸出結果為:true true true true,然而事實卻不是這樣,正確的結果為:true false true true。這是因為動態建立的字串不會去查詢雜湊表,而是直接在託管堆中建立新的string物件,如語句string str3 = 「syetem.」+str1,因此用string.referenceequals來比較str2和str3會返回false,而用string.referenceequals來比較str2和str4會返回true。當然可以將str3字串手動加入到雜湊表中,並返回引用:str3 = string.intern(str3),這樣用string.referenceequals來比較str2和str3會返回true,至於string.equals都返回true的原因是string重寫了equals方法,內部會先檢查兩個引用是否指向同乙個物件,如果是返回true,不是則再比較各個字元。

string 值型別還是引用型別

大家先來看一下下面的 吧!1using system 2using system.collections.generic 34 public class myclass5,a,s 12 1314 輸出的是abc,def 我們都知道陣列是引用型別的,請看一下段 1using system 2class...

關於string是值型別還是引用型別

當然了,string本質上肯定是引用型別,但是這個特殊的類卻表現出值型別的特點 判斷相等性時,是按照內容來判斷的,而不是位址 它肯定是乙個引用型別沒錯,兩個方面來看 1.class string繼承自object,而不是system.valuetype int32這樣的則是繼承於system.val...

關於string是值型別還是引用型別

當然了,string本質上肯定是引用型別,但是這個特殊的類卻表現出值型別的特點 判斷相等性時,是按照內容來判斷的,而不是位址 它肯定是乙個引用型別沒錯,兩個方面來看 1.class string繼承自object,而不是system.valuetype int32這樣的則是繼承於system.val...