zoukankan      html  css  js  c++  java
  • c#基础语言编程-按值类型和引用类型传递参数

    引言

    在介绍传递参数介绍前,请明白参数类型和传递方式是不同的。传递方式分为按值类型和引用类型传递参数。参数类型有值类型和引用类型,这个和C++是不同的。这里的传递方式对应c++中的深复制和浅复制。
    两钟传递方式不同的标志为在调用函数中是否有ref,out这些标志,有的话,则为按引用传递,没有的话就是按值类型传递参数,根据参数类型的不同,可以分为按值传递值类型参数、按值传递引用类型、按引用传递值类型、按引用传递引用类型。

    例子介绍

     //按值传递值类型参数
     private static void M1( int m)
       {
         m++;
       }
       //按值传递引用类型参数,也可以传递类对象、数组、接口、委托等等都是引用类型参数
    private static void M5( string name2)
      {
         name2 = "乔丹";
      }
     // 如果类似在参数中添加ref关键词,则意味这是按引用传递参数,无论是值类型参数还是引用类型参数。
    
    //调用
    string name = "科比";
    M5(name);
    Console.WriteLine(name);//输出科比
    //如果改为:
    M5(ref name);//当然M5中参数前加关键词ref
    Console.WriteLine(name);//乔丹

    上面中按传递值类型参数更容易理解。

    机制解析

    值传递,传递的是栈中的内容,(对于值类型,栈中的内容就是对应的数据。对于引用类型栈中内容就是对象的地址)。
    引用传递,传递的是栈本身的地址,多个变量名实际上指向的是同一个栈变量。
    引用传递必须使用ref关键字修饰。在方法调用的时候传递参数的时候也必须加ref 关键字。这里写图片描述
    按照上图解析,在调用时
    1、确定传递类型
    2、确定参数类型
    3、调用操作
    在按值类型传递时,则在堆栈中进行操作,首先在栈中申请内存区域,讲复制得到的值拷贝其中,如果是值类型参数,就将值拷贝到新申请的区域。如果是引用类型参数,将对象在栈中地址拷贝一份。因为数据是在堆中,类似在堆中的数据有了两个指针,操作那个指针,里面的数据都会变化。但是如果new个对象时,意味着那就是在堆中有新的对象,数据也会不一样。参照M5调用。
    按引用传递时,则是将栈中地址进行拷贝,这就是深复制了。在函数调用时,传递的是栈中地址,意味着函数中操作就是对栈中地址中的数据进行操作了。所以在引用类型中,就是new个对象,意味着栈中地址指向改变,所以返回时,数据会有所改变。

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/polly333/p/4498391.html
Copyright © 2011-2022 走看看