zoukankan      html  css  js  c++  java
  • 老调重弹:参数传递传递引用类型

    C#中值类型和引用类型作为方法参数传递的时候其实都可以说是“值”的传递,只不过这里的“值”指代的东西有所区别。

    当方法的参数为值类型时,方法传递的是值本身的值。

    当方法的参数为引用类型时,方法传递的则是应用类型的引用的地址,也就是引用类型地址在栈上的值。

    举个引用类型作为参数传递的例子

    代码
    static void Main()
    {
    ArgsRef abf
    = new ArgsRef();
    AddRef(abf);
    Console.WriteLine(abf.i);
    Console.Read();
    }

    private static void AddRef(ArgsRef abf)
    {
    //abf = new ArgsRef();
    abf.i = 20;
    Console.WriteLine(abf.i);
    }


    class ArgsRef
    {
    public int i = 10;
    }
    假设Main方法中ArgsRef abf=new ArgRef();中abf的堆栈地址为0x10;则在方法传递的过程中AddRef(abf);实际上是传递的一个地址指向,而这个地址指向也是原来地址的一个拷贝。
    严格意义上也是“值”传递,类似于abf=0x10;
    在把DEMO中的注释去掉的情况下:进到方法AddRef中,如果又执行一次abf=new ArgsRef();此时则更改了abf的地址,将新的地址赋给了abf,假设是0x11。此时在方法体里面
    abf实际上是0x11指向的对象。而Main方法中Console.WriteLine(abf.i)中的abf的地址还是0x10,
    因为方法传递引用参数的时候是传递的地址的拷贝,这一点和值类型传递的时候传递值的一个拷贝是一致的。
    所以:
    上面的例子中,如果方法AddRef的第一行注释掉的话,Main方法里面输出的结果是:20,20;如果把注释去掉的话输出的结果是:20,10
  • 相关阅读:
    NX二次开发-UFUN根据矩阵移动或复制对象uf5947
    NX二次开发-UFUN判断两个向量是否相等UF_VEC3_is_equal
    移动端开发小技巧
    echarts对后端返回的数据进行处理
    Vue router / Element 重复点击导航路由报错解决方法
    谷歌浏览器设置跨域问题
    setLocalStorage的存入与读取
    关于layui中数据表格的使用心得
    npm scss安装错误
    鼠标右键获取页面的坐标
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/1633556.html
Copyright © 2011-2022 走看看