zoukankan      html  css  js  c++  java
  • 关于引用类型用ref传参的问题

               引用类型传参的时候传递的是对象的引用,引用变量是存在线程栈上的,变量的值是 GC堆里的对象的地址

    所以引用变量加ref传参的时候,传递的不是GC堆上变量的地址(也就是引用变量的值),而是引用变量的地址(也就是变量在线程栈上的地址)

    例子:

    using System;

    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Test test = new Test();
                test.Name="Begin";
                Trans(test);
                Console.WriteLine(test.Name);
            }
           public static void Trans(Test test)
            {
                Test t = new Test();
                t.Name = "End";
                test = t;
            }
        }
        public class Test
        {
            public string Name = "Hello";
        }
    }

    未用ref传参,输出结果是Begin,不提。

    若使用ref传参,输出结果是End,使用ref传参的时候 传递的是test变量在线程栈上的地址,而不是test的值(GC堆上变量的地址),在Trans方法里面new了一个新Test对象,把对象在GC对上的地址 存到引用变量t里面。test=t,让test指向t所指向的新对象(这个对象的Name=“End”),方法调用完毕,回到主函数,这时test所指向的对象已经不是以前的对象了,而是在方法Trans里面new的对象。

    如果没有用ref或out关键字的话,在给方法传递参数时,会有一个复制的过程,传递的是拷贝而不是数据本身,不管是值类型还是引用类型。
    当然,用上了ref的话,就没有了这个复制过程,Main方法中的引用变量和方法中的引用变量就是实实在在的同一个引用了。

  • 相关阅读:
    BigDecimal.setScale 处理java小数点
    JS判断用户手机是IOS还是Android
    h5 移动端 监听软键盘弹起、收起
    【java】查重类的实现
    MySQL ORDER BY IF() 条件排序
    版本回退
    Log4j 配置某个类中某个方法的输出日志到指定文件
    简单地实现文章的查重
    simhash算法
    mysql中 for update 使用
  • 原文地址:https://www.cnblogs.com/Jonas/p/1443137.html
Copyright © 2011-2022 走看看