值类型与引用类型

包含引用类型的值类型

在值类型中包含引用类型成员,当对其进行复制或作为参数传递时,其中的引用类型则是将引用的指向复制过来,并没有产生副本(浅复制)

按值传递的引用类型

引用类型同值类型一样,都可以作为参数传递,但与值类型有很大的不同。例如:

定义一个Person类

 class Person
    {
        public string personName;
        public int personAge;
        public Person(string name, int age)
        {
            personName = name;
            personAge = age;
        }

        public void Display()
        {
            Console.WriteLine("Name: {0}, Age: {1}", personName, personAge);
          
        }
    } 

Person类对象按照值类型进行传递

static void SendAPersonByValue(Person p)
        {
            //修改对象的属性
            p.personAge = 99;
            //将对象p指向另一个对象
            p = new Person("Nikki", 99);
        }
static void Main(string[] args)
        {
            
            Person mel = new Person("Mel", 23 );
            SendAPersonByValue(me1);
            mel.Display();
       
        }

输出结果:

Name: Mel, Age: 99

从输出结果可以看出,将引用类型对象作为值传递时,的确是将该对象的引用传递过去了,所以,在子方法中对引用成员的修改会影响主方法中的该引用类型成员,但是在子方法中讲引用参数指向另个对象并未起作用,也就是说无法把引用重新赋值给新的对象,当将引用类型作为值类型传递时,此时该引用类型转化为指针常量,就像数组名一样,只能改变其成员的值,但不能改变该常量指针的指向。

按引用传递引用类型

与前面最大的区别在于,当将引用类型以引用的方式传递时,不仅可以改变该引用类型的状态数据,还可以改变其所指向的对象。

static void SendAPersonByValue(ref Person p)
        {
            //修改对象的属性
            p.personAge = 99;
            //将对象p指向另一个对象
            p = new Person("Nikki", 99);
        }
static void Main(string[] args)
        {
            
            Person mel = new Person("Mel", 23 );
            SendAPersonByValue(me1);
            mel.Display();
       
        }

输出结果:

Name: Nikki, Age: 99

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值