实例对比剖析c#引用参数的用法建议收藏

c#引用参数传递的深入剖析值类型的变量存储数据,而引用类型的变量存储对实际数据的引用。(这一点很重要,明白了之后就能区分开值类型和引用类型的差别)在参数传递时,值类型是以值的形式传递的(传递的是值,对

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

c#引用参数传递的深入剖析
值类型的变量存储数据,而引用类型的变量存储对实际数据的引用。(这一点很重要,明白了之后就能区分开值类型和引用类型的差别)

在参数传递时,值类型是以值的形式传递的(传递的是值,对变量本身没有影响),是将要传递的参数的值复制给函数的形参,因此在函数体类对于该形参的任何改变都不会影响原来的值;

引用类型是以对象引用的形式传递的(传递的是引用,也就是说把同一个父级传过去,拥有相同的父亲),是将要传递的对象的引用复制给函数的形参,这时形参是实参引用的复制,注意:是引用的复制,而不是原引用,和原引用指向相同的对象,因此对于引用对象所做的更改将会直接影响原来的值,但是对于引用本身,在函数内的任何改变将不会影响原引用。

先列出前辈出的两个例子:

 1 class A    {       
 2 public  string data="";    
 3 }    
 4 class Program    {        
 5 static void F(  A a1)        {           
 6  //a1指向传来的对象a    http://www.cnblogs.com/roucheng/                     
 7 a1.data = "2";//修改a1指向的对象            
 8 a1 = new A();//a1指向另一个对象,注意,这时a1已经不指向原来的对象a了,而原来的引用还是指向对象a           
 9  a1.data = "3";//修改新建的对象,不会影响原来对象a的值        
10 }        
11 static void Main()        {            
12 A a = new A();//实例化A的一个对象,并用a1指向该对象            a.data = "1";//将a的data字段赋值为"1"            
13 F(a);//调用函数F,注意:这时将对象a的引用(不是对象a)赋值给参数a1,           
14  Console.WriteLine(a.data);        }    }

这是一个直接传递的例子,在F(a)调用时,是把值传递过去,a是引用参数,所以传递的是引用,也就是说把a的引用当做值传递给了F()函数中的a1,在F()函数中对a1操作:a1.data = “2”;就改变了a的值,当执行a1 = new A();时,a1的引用初始化,也就是说不再是传过来的那个,所以在执行a1.data = “3”;是对a没有影响。下面一个例子你会看到传递的不是值而就是引用,也就是说把引用传给了a1,在a1 = new A();时,改变的是引用,也就是说引用的父亲本身就变了 所以也就是改变了a的引用,最后a的值变成了3

 

ref 串参数:ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:对于值类型,可以向上面的引用串参数一样传递,对于已经是引用类型的参数,大家可能会说那不是多此一举吗?其实不然,因为其中的实机理完全不一样:考查上个示例的变种    

 1 class A    {       
 2 public  string data="";    
 3 }   
 4  class Program    {        
 5 static void F( ref A a1)        {           
 6  //a1和a是同一个实例,而不是指向同一对象的引用,即a1和a在存在于内存中的地址是一样的           
 7  a1.data = "2";//修改a1指向的对象           
 8  a1 = new A();//a1指向另一个对象,理所当然别名a也指向该对象了,注意,这时原来的对象已经没有任何引用指向了,因此,可以说原来的对象已经不可访问了。         
 9    a1.data = "3";//修改新建的对象的属性        }        static void Main()        {           
10  A a = new A();//实例化A的一个对象,并用a1指向该对象            a.data = "1";//将a的data字段赋值为"1"           
11  F(ref a);//调用函数F,注意:这时将对象a的引用传给a1,不是赋值,相当与 给a对象的引用起了个别名           
12  Console.WriteLine(a.data);//这时a已经指向函数中新建的对象,因此值应为"3"       
13  }    

可以这么理解,没有ref时的引用对象的参数传递就相当于c++中的一般指针传递(函数声明相当于: void F(Type * v)),而有ref时的引用对象的参数传递相当于c++中的一般指向指针的指针传递(函数声明相当于: void F(Type ** v)).

http://www.cnblogs.com/roucheng/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120726.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月21日 上午6:00
下一篇 2021年12月21日 上午7:00


相关推荐

  • linux iptable设置防火墙

    linux iptable设置防火墙Iptables防火墙规则使用梳理 iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。以下对iptables的规则使用做了总结性梳理:iptables首先需要了解的…

    2022年5月27日
    43
  • php 变量名前加一个下划线含义

    php 变量名前加一个下划线含义

    2021年10月21日
    44
  • 33.form标签中的GET和POST提交方式

    33.form标签中的GET和POST提交方式form 标签中的 GET 和 POST 在 HTML 中 form 表单的作用是收集标签中的内容 form form 中间可以由访问者添加类似于文本 选择 或者一些控制模块等等 然后这些内容将会被送到服务端 一个表单必须指定两样东西 form 的 method 参数用于设置表单的提交方式 默认使用 POST action 用于设置表单的提交 url 如果不写或者保持空字符串 那么将使用当前的 URL form 表单使用 post 方式提交的例子 下面例子实现流程 当我们第一次访

    2026年3月18日
    2
  • Java函数式编程之Java8四大函数接口

    【前序】:在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作。它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。文章目录1.消费型接口2.供给型接口3.函数型接…

    2022年4月16日
    50
  • 关于System.arraycopy方法的使用

    关于System.arraycopy方法的使用随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)在对数组进复制时,我们可以编写一个for循环实现,但是比较麻烦,我们可以使用System类的静态方法arraycopy()。arraycopy()方法的签名如下:publicstaticvoi…

    2025年7月23日
    5
  • Java开发手册之注释规约「建议收藏」

    Java开发手册之注释规约「建议收藏」Java开发手册之注释规约

    2022年4月22日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号