• C#基础知识回顾一ref 和 out


    今天重新看<<C#图解教程>>发现了里面的一段话:

    5.7值参数

      有几种参数,它们使用稍微不同的方法从方法传入或传出数据。你到现在一直看到的这种类型是默认的类型,称为值参数

      使用值参数,数据通过复制实参到形参的方式传递到方法。方法调用时,系统做如下的操作:

      []在栈中为形参分配空间

      []复制实参到形参

      变量在用作实参必须被赋值,对于引用类型,变量可以被赋值为一个引用或者null

      PS:值参数和值类型是两个完全不同的概念,值参数是把实参的值复制到形参的参数。

     下面这个例子:

    class Myclass
    {
       public int Val = 20;
    }
    class Program
    {
        static void Mythod(Myclass f1,int f2)
        {
            f1.Val +=5;
            f2 += 5;  
        }  
    }
    
    static void Main()
    {
        Myclass a1 = new MyClass();
        int a2 = 10;
        Mythod(a1,a2);
        
    }
    

    [] 在方法被调用之前,用作实参的变量a1,a2已经在栈里面了。

    []随着方法的开始,系统在栈中形参分配空间,并从实参复制值

       因为a1是引用类型,所以引用被复制,结果实参和形参都引用堆中的同一个对象

       因为a2是值类型,所以值被复制,产生一个独立的数据项

    []在方法的结尾,f2和对象f1的字段都加上了5

    []方法的执行后,形参被栈中弹出

       a2,值类型,它的值不受方法的行为的影响

       a1,引用类型,但它的值被方法的行为改变了。

    那么ref到底有什么用呢,简单的说,就是将值类型的传递类型变成引用传递。

    PS:我之前一直以为String类型是引用类型,所以在使用方法后他的值是会改变的,其实不然,String虽然是名义是引用类型,但还是以值传递的方式进行改变的。

  • 相关阅读:
    javascript判断触发事件event的鼠标按钮
    解决IE8 Session共享问题
    SignalR 实现web浏览器客户端与服务端的推送功能
    MFC ActiveX控件与ATL ActiveX控件的比较 .
    rpm relevent operation record
    通过rpm包安装、配置及卸载mysql的详细过程 Richard Shen 运维/架构 51CTO技术博客
    instal python relevent cmds
    ubuntu日志的设置
    关于电信、网通检测ADSL共享上网的技术手段
    Simple usage of Python's logging module
  • 原文地址:https://www.cnblogs.com/codefish/p/2747332.html
Copyright © 2020-2023  润新知