C# List 作为参数传递的值变化
发布日期:2021-08-25 00:12:12
浏览次数:1
分类:技术文章
本文共 2727 字,大约阅读时间需要 9 分钟。
一、示例演示
namespace TestConsole{ class Program { static void Main(string[] args) { Console.WriteLine(""); Listlist1 = new List (); Test1(list1); Console.WriteLine(" list1:" + list1.Count()); // 总数量为 1 Console.WriteLine(""); Console.WriteLine("---- 亮瞎眼的分割线 ----"); Console.WriteLine(""); List list2 = new List (); Test2(list2); Console.WriteLine(" list2:" + list2.Count()); // 总数量仍为 0 Console.WriteLine(""); } static void Test1(List list) { list.Add("1"); Console.WriteLine(" Test1():" + list.Count()); // 总数量为 1 } static void Test2(List list) { List list2 = new List (); list2.Add("1"); list = list2; Console.WriteLine(" Test2():" + list.Count()); // 总数量为 1 } }
可以发现:
经过 Test1后,list 的元素数量由 0 变为 1 了,
经过 Test2后,list 的元素数量还是0。
二、解说
1.list类型是引用类型
2.引用本身是类似于一个“保存地址的值变量”
所以从方法外部传入引用到方法里,那么其实引用本身是复制了一份副本来给方法里使用的,只是说这个复制的引用副本和之前的引用的内容(也就是所指向的对象内存地址)是一样的,所以通过引用操作对象的数据时,可以看到2个引用都操作的同一个对象;但如果你是修改了引用副本本身的值内容(将该引用指向了一个新的对象的内存地址),那么是不会影响到之前方法外的那个引用的,所以修改后会发现2个引用所指向的对象不同了而如果对象引用参数前加上了ref,那么方法参数所传递的不再是引用的副本,而是引用的地址了(即通过引用的地址找到引用,再读出引用里保存的内存地址值,再根据则个地址值去找到真正要操作的对象),所以如果此时你再修改这个引用的值时,会根据引用的地址找到方法外的那个引用,然后修改其内容,所以会发现方法外的引用也会指向新的对象了3这里有三段代码
你可以看看,体会一下:
(1)
Listlist=new List ();ModifyList(list);Console.WriteLine(list.Count) private void ModifyList(List list){ // 这里的list其实已经是一个引用副本了,但是所指向的内存地址仍然是原本方法外面的对象的,所以后面用该引用的Add方法所操作的,仍然是原本方法外面的对象的内存数据 list.Add("1"); list.Add("2"); list.Add("3");}
(2)
Listlist=new List ();ModifyList(list);Console.WriteLine(list.Count) private void ModifyList(List list){ list = new List (); // 这里其实已经将引用指向了新的内存地址,所以后续的Add操作是在操作新对象的内存数据,而原来方法外的对象其实是没有受到影响的 list.Add("1"); list.Add("2"); list.Add("3");}
(3)
Listlist=new List ();List copy = list; // 复制一个引用ModifyList(ref list);Console.WriteLine(copy.Count) // 复制的这个引用仍然指向原来最早的那个ListConsole.WriteLine(list.Count) // list这个引用已经在ModifyList方法里被修改了,指向的是在ModifyList方法里新new出来的对象了 private void ModifyList(ref List list){ list = new List (); // 因为有ref,所以这里其实已经将方法外原本的那个引用也指向了新的内存地址,所以后续的Add操作是在操作新对象的内存数据,并且方法外原本的那个引用也指向了这个新的对象 list.Add("1"); list.Add("2"); list.Add("3");}
参考:
http://www.cftea.com/c/2013/01/5724.asp
http://bbs.csdn.net/topics/390600826
转载地址:https://blog.csdn.net/weixin_33836223/article/details/90226385 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月12日 14时42分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SAP OData 的 V2 模型
2019-04-27
如何处理使用 SAP UI5 消费真实的 OData 服务时遇到的跨域问题
2019-04-27
SAP Fiori 页面的周期性动态刷新功能的实现步骤
2019-04-27
Angular Reactive Form 的一个具体使用例子
2019-04-27
关于 SAP UI5 Table 控件中行合并的实现方式
2019-04-27
Angular 使用 Injector API 人工获取依赖注入的实例
2019-04-27
解决微信视频号 当前浏览器不支持此视频格式 的错误消息
2019-04-27
SAP UI5 XML 视图里 label 和 text 控件文本对齐问题
2019-04-27
SAP Spartacus 使用 customized API
2019-04-27
SAP Spartacus Reference App Structure
2019-04-27
RxJs fromEvent 工作原理分析
2019-04-27
RxJs map operator 工作原理分析
2019-04-27
ABAP 编程语言中的系统字段(System Fields)
2019-04-27
如何使用 Putty 以密钥 private key 的方式登录腾讯云主机
2019-04-27
SAP CRM One Order 框架培训材料
2019-04-27