c#中引用类型作为值参数和引用参数问题(ref的作用)

c#中引用类型作为值参数和引用参数问题

一、分类

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。

C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

 

二。参数传递

  对于引用类型,不管是将其作为值参数传递还是引用参数传递,都可以在方法成员内部修改其内容。而值类型则不能修改。首先举一个简单的例子

(1)引用类型和值类型作为参数传递的区别:

复制代码

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

namespace 引用类型问题
{
    class Program
    {
        static void test1(ref int val1,int val2)
        {
            val1 = 10;
            val2 = 20;
            Console.WriteLine("val1={0},val2={1}", val1, val2);
        }

        static void Main(string[] args)
        {
            myclass mc = new myclass();
            test1(ref mc.val1, mc.val2);
            Console.WriteLine("函数调用后:val1={0},val2={1}", mc.val1, mc.val2);
            Console.ReadKey();
        }
    }

    class myclass
    {
        public int val1 = 0;
        public int val2 = 0;
    }
}

复制代码

输出结果是:  val1=10,val2=20
        函数调用后:val1=10,val2=0

  

  引用类型中,如果在方法内创建新对象并赋值给形参会产生什么结果呢?

(1)引用类型作为值参数传递时,如果在方法内创建对象并赋值给形参,将切断形参与实参之间的联系,并在方法调用结束后,新对象也不复存在

复制代码

class myclass
    {
        public int val1 = 10;
    }

    class Program
    {
        static void test1(myclass f1)
        {
            f1.val1 = 60;
            Console.WriteLine("创建新对象前:val1={0}", f1.val1);
            f1 = new myclass();
            Console.WriteLine("创建新对象后:val1={0}", f1.val1);

        }

        static void Main(string[] args)
        {
            myclass mc = new myclass();
            Console.WriteLine("函数调用...");
            test1(mc);
            Console.WriteLine("函数调用后:val1={0}", mc.val1);
            Console.ReadKey();
        }
    }

复制代码

输出结果为:  函数调用...
        创建新对象前:val1=60
        创建新对象后:val1=10
        函数调用后:val1=60

值得注意的是,函数调用结束后并没有改变val1的值,因为在方法调用结束后新对象已经不存在了。

 

(2)引用类型对象作为引用参数传递时,如果在方法内创建对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值

复制代码

class myclass
    {
        public int val1 = 10;
    }

    class Program
    {
        static void test1(ref myclass f1)
        {
            f1.val1 = 60;
            Console.WriteLine("创建新对象前:val1={0}", f1.val1);
            f1 = new myclass();
            Console.WriteLine("创建新对象后:val1={0}", f1.val1);

        }

        static void Main(string[] args)
        {
            myclass mc = new myclass();
            Console.WriteLine("函数调用...");
            test1(ref mc);
            Console.WriteLine("函数调用后:val1={0}", mc.val1);
            Console.ReadKey();
        }
    }

复制代码

这段代码和上面几乎没区别,只是在引用参数调用的时候添加了ref关键字,但结果却不一样

输出结果为:  函数调用...
        创建新对象前:val1=60
        创建新对象后:val1=10
        函数调用后:val1=10

函数调用后val1的值也变成了10.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值