• C#形参和实参、引用类型和值类型使用时的一个注意点。


    这是早上群里讨论的例子。

     1 static void main(string [] arg){
     2 
     3 var p1=new Person{Name="张三"};
     4 var p2=new Person{Name="李四"};
      int i=0;
    5 A1(p1,i); 6 A2(p2,ref i); 7 Console.WriteLine(p1.Name+"----"+i);//输出张三-----0 8 Console.WriteLine(p2.Name+"----"+i);//输出孙六-----1
    9

    }
    10

    11 void A1(Person ppp,int i){
          i++;
    12 ppp=new Person{Name="王五"};
    13 }
    14 void A2(Person ppp,ref int i){
          i++;
    15 ppp.Name="孙六"; 16 }

    80%的老程序员在输出p1.Name时都错了,都以为是王五。一开始我也不理解。A1中引用类型的ppp改变了,为什么输出的还是“张三”?后来搜索资料明白了关键因素——【形参和实参是两个不同的变量!】

    形参就是方法声明时的参数。如void A1(string ppp)的ppp。

    实参就是调用方法时传递的参数。如A1(p1)的p1。

    百度知道里一位大牛的总结:
    【函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。】
    因为A1方法里,ppp=new Person{Name="王五"};的操作把形参ppp地址改变了,不在是p1的引用地址。所以导致无法对实参p1产生影响。
    对比A2。ppp和p2的引用地址始终一样。所以对p1一直有影响。

    说道这里我们在扩展一下C#中out和ref 两种参数的修饰。

    ...敬请期待

  • 相关阅读:
    VMware虚拟机网络桥接模式下无法与主机ping通解决办法
    (一)编写Bootloader程序应该注意的一些问题
    使用TrueSTUDIO和MDK编译器生成.bin文件
    Linux开发板通过串口与电脑上位机通信
    STM32知识点
    仿真器SWD可不接复位引脚的原因
    ARM内核常用缩写含义
    三大范式(转)
    修改主键示例
    ROW_NUMBER用法详解
  • 原文地址:https://www.cnblogs.com/MLGB/p/4210876.html
Copyright © 2020-2023  润新知