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个对象,意味着栈中地址指向改变,所以返回时,数据会有所改变。

  • 相关阅读:
    C#获取MD5哈希字符串
    C#序列化和反序列化Json数据
    C# Http请求
    C#DAL数据访问层
    C# ThreadPool.QueueUserWorkItem()之线程池异步
    C#以文件夹共享方式实现2G以上大文件传输
    该进程不具有执行此操作所需的“SeSecurityPrivilege”特权
    IIS绑定网站用域名进行访问的过程
    js获取url指定参数值
    js闭包(for循环内给元素添加事件)
  • 原文地址:https://www.cnblogs.com/polly333/p/4498391.html
Copyright © 2011-2022 走看看