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方法中的引用变量和方法中的引用变量就是实实在在的同一个引用了。

  • 相关阅读:
    灵活修改页面控件
    玫瑰颜色各代表什么含义?
    转:TCP端口详解
    将数据导出成text文件
    将.net布署在运行Apache服务器上
    在多线程下请注意代码的安全
    OpenWrt 设置IP地址
    WordPress 内存缓存加速插件:Batcache
    PVE 开启https 及免费SSL证书申请
    获取OpenWrt mac地址
  • 原文地址:https://www.cnblogs.com/Jonas/p/1443137.html
Copyright © 2011-2022 走看看