c#引用类型变量在程序中的变化

本文通过几个具体的C#代码示例,深入探讨了引用类型的工作原理,并解释了字符串作为特殊引用类型的行为。此外,还讨论了一个关于列表排序操作的具体案例,展示了如何正确理解和使用引用类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我的第一篇博客。

想到写博客,是因为记录在纸上的东西,总怕哪天一丢,那些出过的错误又回来缠绕自己。

好了,那就步入正题吧!

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该属性后,会产生一个新实例。

由此,我便恍然大悟,然而,其中缘由不得而知。鄙人虽好思考,但无从做参考,也就罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值