C#值类型和引用类型作为方法参数时,加与不加ref的区别

示例1:

        private static void Main(string[] args)
        {
            StringBuilder test = new StringBuilder();
            test.Append("HELLO ");
            MyTest(test);
            Console.WriteLine(test);
            Console.ReadLine();
        }

        private static void MyTest(StringBuilder str)
        {
            str.Append("WORLD !");
        }

在调用MyTest方法的时候,将实例的内存地址传递给方法参数str,此时,test和str中的地址都指向保存实例的内存。

运行结果:

示例2:

        private static void Main(string[] args)
        {
            StringBuilder test = new StringBuilder();
            test.Append("HELLO ");
            MyTest(test);
            Console.WriteLine(test);
            Console.ReadLine();
        }

        private static void MyTest(StringBuilder str)
        {
            StringBuilder temp = new StringBuilder();
            temp.Append("haha!");
            str = temp;
        }

在调用MyTest方法的时候,将实例1的内存地址1传递给方法参数str,此时,test和str中的地址都指向实例1的内存。在执行完str = temp时,将实例2的内存地址2传递给方法参数str,此时,temp和str中的地址都指向保存实例2的内存,str不再指向实例1。但是,test中的地址仍然指向实例1。

运行结果:

示例3:

        private static void Main(string[] args)
        {
            StringBuilder test = new StringBuilder();
            test.Append("HELLO ");
            MyTest(ref test);
            Console.WriteLine(test);
            Console.ReadLine();
        }

        private static void MyTest(ref StringBuilder str)
        {
            StringBuilder temp = new StringBuilder();
            temp.Append("haha!");
            str = temp;
        }

在执行MyTest方法后,此时将实例地址1的地址传递给方法参数地址的地址。此时实例地址1的地址指向实例地址1(test),方法参数地址的地址指向方法参数地址(str),其实“实例地址1(test)”和“方法参数地址(str)”是同一块内存区域(应该吧)。实例地址1(test)和方法参数地址(str)都指向实例1。在执行完str = temp后,实例2的地址(实例地址2(temp))传递给方法参数地址(str)(也就是实例地址1(test)),此时,实例地址1(test)、方法参数地址(str)和实例地址2(temp)均指向实例2。

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值