C# 引用类型作为函数参数时一些需要注意的地方

1.请看下面的这个例子:

----------定义一个类-------------------

    public class RefClass
    {
        public int IntValue
        {
            get;
            set;
        }
    }

----------定义四个静态方法-------------------

        #region 测试值传递
        static void AddValue(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址
        {
            prc.IntValue++; //prc->IntValue++;
        }

        static void AddValue(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址
        {
            prc.IntValue++;//(*prc)->IntValue++;
        }

        static void ChangeRef(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址
        {
            prc = new RefClass() { IntValue = 1000 };
            //prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象
        }

        static void ChangeRef(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址
        {
            prc = new RefClass() { IntValue = 1000 };
            //*prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象
        }

        #endregion

----------测试方法-------------------

        private void button3_Click(object sender, EventArgs e)
        {
            string ResultMsg = "";

            RefClass rc = new RefClass() { IntValue = 1 };//RefClass *rc=new RefClass() { IntValue = 1 };请注意new关键字在C++中创建的是指向对象的指针不是对象
            AddValue(rc);//rc,传递指向RefClass对象的指针
            ResultMsg+="调用AddValue(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            rc.IntValue = 1;//(注意这里重新把IntValue的值赋值为了1)
            AddValue(ref rc);//&rc,传递指向RefClass对象指针的指针
            ResultMsg += "调用AddValue(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            rc.IntValue = 1;
            ChangeRef(rc);//rc,传递指向RefClass对象的指针
            ResultMsg += "调用ChangeRef(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            rc.IntValue = 1;
            ChangeRef(ref rc);//&rc,传递指向RefClass对象指针的指针
            ResultMsg += "调用ChangeRef(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";

            MessageBox.Show(ResultMsg);
        }

----------测试结果截图-------------------

----------结果分析-------------------

1.第一个函数AddValue(rc),形参指向了和实参一样的一个地址的拷贝,注意是拷贝

   修改形参指向对象的属性值,直接会影响实参的指向对象的属性值,因为它们指向了同一个地址(虽然是拷贝),结果为2

2.第二个函数AddValue(ref rc),形参指向了和实参一样的一个地址,注意,这里是同一个地址,形参地址

   的改变会直接导致实参地址的改变,它不是拷贝,和第一个函数一样,修改形参指向对象的属性值,肯定会直接回影响实参的指向对象的属性值,结果为2

3.第三个函数ChangeRef(rc),在这个函数里面prc = new RefClass() { IntValue = 1000 };,重新把形参指向了了一个新的地址

    注意是指向了一个新的地址,因为它new了一个新的对象,而没有改变实参地址指向对象的属性值,由于它只是实参地址的一个拷贝,所以结果为1

4.第四个函数ChangeRef(ref rc),由于加上了ref关键字,形参指向了和实参一样的一个地址,它不是拷贝,所以

   当形参指向了一个新的地址时,实参的地址也跟着改变了,所以结果为1000

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值