• 关于C#值类型,引用类型,值传递,引用传递(ref,out)


    说到参数传递,必须得弄清值类型和引用类型:
    (
    为了容易表达,我暂且命名存放在堆中的内容为堆中对象,存放在栈上的内容为栈中对象。)
    值类型存放在栈中,直接访问。如果有:
    int a=0;int b=a;就产生了两个栈中对象。
    引用类型需要在堆中显式分配,且不能直接访问,需要在栈中分配一个栈中对象(C++叫指针,C#叫引用)指向其堆中对象

    如果:
    StringBuilder strb = new StringBuilder();
    StringBuilder strb2 = strb;
    则在堆中只有一个堆中对象,只是栈中有两个栈中对象指向堆中对象。
    可以看出:每个变量都是一个栈中对象。不管是值类型还是引用类型,只是值类型的栈中对象就是其内容,而引用类型的栈中对象只是一个指向堆中对象的地址。

    判断是值类型还是引用类型:

    代码
    int a1 = 10;
    StringBuilder strb1 
    = new StringBuilder("ABC");

    int a2 = a1;
    StringBuilder strb2 
    = strb1;

    bool bl1 = object.ReferenceEquals(a1,a2);   //false为值类型(因为值类型要装箱)
    bool bl2 = object.ReferenceEquals(strb1,strb2);   //true为引用类型

     

    参数传递分值传递和引用传递两种。
    通常,在没有显式指出ref和out时都是值传递。ref必须设初始值,out可以不设初始值

    值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递对象的栈中对象的拷贝。)
    引用传递:传的是栈中对象的地址。(即函数内参数对象与调用时传递对象完全是同一栈中对象。)
    现在用例子来说明传值跟传地址的不同:

    代码
    class T
        {
            
    void Display()
            {
                StringBuilder strb1 
    = new StringBuilder();
                StringBuilder strb2 
    = new StringBuilder();
                Test1(strb1);
                Test2(
    ref strb2);
                
    string str1 = strb1.ToString(); //str1值:"A"
                string str2 = strb2.ToString(); //str2值:"BC"
            }
            
    void Test1(StringBuilder strb)
            {
                
    //strb和strb1是两个栈中对象,但指向相同的地址,这个操作是改变堆中对象
                strb.Append("A");

                
    //这里将strb指向一个新的堆中对象,所以后面的操作与strb1指向的栈中对象无关
                strb = new StringBuilder("B");
                strb.Append(
    "C");
            }

            
    void Test2(ref StringBuilder strb)
            {
                
    //这里的strb和strb2是同一个栈中对象,所以改变strb的值使其指向另一个对象也等于改变strb2
                strb = new StringBuilder("B");
                strb.Append(
    "C");
            }
        }

  • 相关阅读:
    微信“为盲胞读书”项目上线“团体领读”新功能
    神秘代码让iPhone微信闪退的解决方法
    [腾讯首季业绩数据]微信支付用户数持续上升
    [民间调查]小学生微信使用情况的调查 90%小学高年级学生用微信
    O2O模式成功案例分享 汲取精华化为己用
    太原警方通过微博提醒您手机丢失如何保微信安全
    百度富媒体展示允许自定义站点Logo/简介等
    网页出现scanstyles does nothing in Webkit / Mozilla的解决方法
    安卓微信新版内测 可分享小视频/可设微信字体大小
    微信电脑版微信1.1 for Windows更新 可@人/转发撤回消息/可播小视频
  • 原文地址:https://www.cnblogs.com/jes_shaw/p/1952669.html
Copyright © 2020-2023  润新知