c#引用型別變數在程式中的變化
這是我的第一篇部落格。
想到寫部落格,是因為記錄在紙上的東西,總怕哪天一丟,那些出過的錯誤又回來纏繞自己。
好了,那就步入正題吧!
c#引用型別,具體請看別人寫的部落格吧
這裡有一個有趣的現象:
class Program
{
static void Main(string[] args)
{
object a = "test";
object b = "te" + "st";
System.Console.WriteLine(string.Format("k == j:{0}",a == b));
System.Console.WriteLine(string.Format("a:{0}->{1} b:{2}->{3}", a, getMemory(a), b, getMemory(b)));
string s1 = "test";
string s2 = "te";
s2 += "st";
var a1 = (object)s1;
var a2 = (object)s2;
System.Console.WriteLine(string.Format("s1 == s2:{0}",s1 == s2));
System.Console.WriteLine(string.Format("a1 == a2:{0}",a1 == a2));
System.Console.WriteLine(string.Format("a1:{0}->{1} a2:{2}->{3}", a1, getMemory(a1), a2, getMemory(a2)));
System.Console.ReadLine();
}
public static string getMemory(object o) // 獲取引用型別的記憶體地址方法
{
GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
return addr.ToString();
}
}
//-----輸出結果------
k == j:True
a:test->52754720 b:test->52754720
s1 == s2:True
a1 == a2:False
a1:test->52754720 a2:test->52759772
由此看出,引用型別變數是否相等,是要看引用的地址是否相同。特別說明,字串是特殊的應用型別,值相等,引用相同。
以上是鄙人在瞭解引用型別的過程中所做的功課,但是,發生這一切的,卻是另一個問題,簡單描述如下:
class A
{
IList<PatrolRecord> PatrolRecords;
functionName()
{
IList<PatrolRecord> patrolRecords = this.PatrolRecords.OrderBy(a => a.PatrolPoint).ThenBy(a => a.PatrolResult.Value).ToList();
}
}
當對A的例項,呼叫functionName方法的時候,我發現該例項的屬性PatrolRecords並沒有發生任何變化。出於質疑和好奇,最後驗證得出,OrderBy該屬性後,會產生一個新例項。
由此,我便恍然大悟,然而,其中緣由不得而知。鄙人雖好思考,但無從做參考,也就罷了。