这是我的第一篇博客。
想到写博客,是因为记录在纸上的东西,总怕哪天一丢,那些出过的错误又回来缠绕自己。
好了,那就步入正题吧!
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该属性后,会产生一个新实例。
由此,我便恍然大悟,然而,其中缘由不得而知。鄙人虽好思考,但无从做参考,也就罢了。