zoukankan      html  css  js  c++  java
  • 引用类型参数,ref按引用传值

    出处:http://blog.sina.com.cn/s/blog_6edd550601012rj8.html

    在C#中,当参数是引用类型并且是以传值的方式传入参数的时候(没有加ref关键字),方法传入的是这个对象的引用的一个副本,相当于是以一个引用的值按照传值的方式调用方法,这个引用在方法内部会生成一个副本,就像普通的值类型变量一样,但是由于这个引用的副本和原来方法外面的类型的引用是指向了同一个对象,所以在方法内部对这个对象进行的各种操作(改变对象的属性等)看上去就像是按引用传递变量了一样,返回之后对象会发生变化。但是如果在方法内部对这个引用的副本进行了赋值操作,那么这个引用的副本就不再指向原来的对象了,方法返回后,原来的对象自然也不会发生变化。
    结论:在C#的方法调用中,传入引用类型做参数而没有加ref关键字的时候,它仍然是以值传递的方式传递参数的,只不过传入方法内部的是对象的引用的值。
    具体下面的代码
    StringBuilder s1 = new StringBuilder();
    StringBuilder s2 = new StringBuilder();
    operatorstring(s1, s2);
    void operatorstring(StringBuilder sb1, StringBuilder sb2)

    对sb1和sb2的操作会反应在s1和s2的值上面。但是当sb1或者sb2的引用转向其地方,则和s1,s2的值脱离干系了。
    static void Main(string[] args)
           {
               StringBuilder s1 = new StringBuilder("a");
               StringBuilder s2 = new StringBuilder("b");
               operatorstring(s1, s2);
               Console.WriteLine(s1.ToString() + "," + s2.ToString());
           }
           static void operatorstring(StringBuilder sb1, StringBuilder sb2)
           {
               sb1.Append("c");
               //sb2 = new StringBuilder();
               sb2.Append("c");
            }
    此代码打印出ac,bc
    但当去掉注释,变成
    static void operatorstring(StringBuilder sb1, StringBuilder sb2)
           {
               sb1.Append("c");
               sb2 = new StringBuilder();
               sb2.Append("c");
            }
    则打印出ac,b。

    要真正的传递引用,则要使用ref关键字
    [STAThread]
           static void Main(string[] args)
           {
               StringBuilder s1 = new StringBuilder("a");
               StringBuilder s2 = new StringBuilder("b");
               operatorstring(s1, ref s2);
               Console.WriteLine(s1.ToString() + "," + s2.ToString());
           }

           static void operatorstring(StringBuilder sb1, ref StringBuilder sb2)
           {
               sb1.Append("c");
               sb2 = new StringBuilder();
               sb2.Append("c");
           }
    此代码打印出ac,c

  • 相关阅读:
    AOP的相关理论介绍
    代码访问数据库时没有报错一直转圈,MySQL不同驱动版本的连接方式
    Linux(CentOS7)设置固定获取IP地址
    NodeJS的安装与配置
    IDEA启动tomcat访问localhost:8080出现404错误
    Win10笔记本电脑外接显示器,如何在笔记本合上的时候让他继续在显示器上使用
    SpringBoot集成Swagger-Bootstrap-UI(已改名为Knife4j)
    Redis学习之Jedis的操作和使用
    SpringBoot整合Swagger2,搭建Restful API在线文档
    IDEA创建SpringBoot项目时出现:Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings.
  • 原文地址:https://www.cnblogs.com/dusf/p/13439078.html
Copyright © 2011-2022 走看看