C#学习心得(引用类型对象作为值参数传递-1)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace three5
{
    internal class Program
    {
        static void Main(string[] args)
        {
 
            
            Myclass a1 = new Myclass();   

            Console.WriteLine($"Before method call:{a1.val}"); //20
         
                                           
            RefAsParameter(a1);//实参        

            Console.WriteLine($"After method call:{a1.val}"); //50  

        }
        static void RefAsParameter(Myclass f1)//形参
        {
            
            f1.val = 50;        

            Console.WriteLine($"After member assignment: {f1.val}"); //50
           
            f1 = new Myclass();
   
            Console.WriteLine($"After new Object creation:{f1.val}");//20

        }
    }
    class Myclass
    {
        public int val = 20;
    }

}

 一开始无法理解,为什么第四个输出会是50?

1、第一个输出是20;

2、实参和形参同时指向20,进入方法体里面,对象的成员重新赋值之后,实参和形参仍然指向堆中的数据50;

3、当方法里分配新的对象并赋值给形参时,方法体外面的实参还是指向原对象,a1还是指向的是50,但是形参会指向新的对象

4、在方法调用之后,实参会指向原对象,形参和新对象都会消失

结论:

如果在方法内创建一个新的对象并赋值给形参,就会切断形参与实参之间的关联,并且在方法调用之后,新对象也会消失

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值