|
大家都知道,C#中的string是一個引用類型,String對象是存放在堆上,而不是堆棧上的,因此,當(dāng)把一個字符串變量賦給另一個字符串時,會得到對內(nèi)存中同一個字符串的兩個引用。但是大家有沒有想過,為什么修改其中一個字符串,另外一個不受影響呢? class StringExc { public static void Main() { string s1 = "original string"; string s2 = s1; //注意此時會創(chuàng)建一個新對象 Console.WriteLine( "s1 is " + s1 ); Console.WriteLine( "s2 is " + s2 ); s1 = "changed string"; Console.WriteLine( "s1 is now " + s1 ); Console.WriteLine( "s2 is now " + s2 ); } }輸出結(jié)果為: 也就是說,改變s1的值并沒有對s2造成任何影響,這與我們平時所說的引用類型的行為正好相反。當(dāng)用值"original string"初始化s1時,就在堆上分配了一個String對象。在初始化s2時,引用也指向這個對象,所以s2的值也是"original string"。但是現(xiàn)在要改變s1的值,而不是替換原來的值時,堆上就會為新值分配一個新對象。s2變量仍然指向原來的對象,所以它的值沒有改變。 另外,如果我們像下面這樣: public override bool Equals(object);
public bool Equals(string); public static bool Equals(string, string); 前兩個實例方法內(nèi)部會調(diào)用CompareOrdinal靜態(tài)方法,它會字符串中的各個字符,如果相等就返回true。第三個首先會檢查兩個引用指向的是否是同一個對象,如果是,就返回true,不再去比較各個字符了。 分類: 02 C#/.NET
|
|
|