值类型和引用类型的传参问题

        关于值类型和引用类型已经写了两篇博客,之前大多都是理论阶段,今儿就举个栗子来看看他们两种数据类型在传递参数方面到底有什么不同的地方。今天的开场白还真的挺开门见山的哈~


首先建立一个person的类,有姓名、年龄、样貌三个属性

public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string Look { get; set; }

        }

然后客户端调用:

我们首先实例化person这个类,并赋给他初始值,但是呢我想让他变得年轻一点,变得强壮一点

class Program
    {
        static void Main(string[] args)
        {
            //初始化khalil的值,姓名khalil,年龄33,很瘦很瘦
            Person khalil = new Person { Name = "khalil", Age = 33 ,Look ="thin" };

            //但是我想让我的偶像变得年轻一点,strong一点
            int age = khalil.Age;//声明了一个值类型变量,并将大同的年龄减少了3岁
            khalil.Age = 30; 
            Person 方大同 = khalil;//声明了一个引用类型变量
            khalil.Look = "strong";//khalil想变得强壮一点

          
            Console.WriteLine("khalil's age:\t{0}", khalil.Age);
            Console.WriteLine("age's value:\t{0}", age);
            Console.WriteLine("khalil's look:\t{0}", khalil.Look);
            Console.WriteLine("datong's look:\t{0}", 方大同.Look );
            Console.ReadLine();
        }
    }


运行结果:


      从运行结果我们可以看到我虽然想让方大同变得年轻一点,但是他实际的年龄没有发生改变,但是样貌这个属性确实改变了。这是因为age是int类型属于值类型,而look是string类型是引用类型,当执行


int age = khalil.Age


这一句代码时,是在栈中重新分配一块内存,存放khalil.Age的副本,所以栈中是这个样子的:

 khalil.Age = 30;


执行完这一句,栈中是变成了这个样子,改变的只是副本:


我们在来看看look属性的变化,执行完下边一句,栈中是这个样子的(黑色箭头):

Person 方大同 = khalil;//声明了一个引用类型变量

这行代码的意思是将khalil的引用地址赋给了方大同,所以两个对象指向同一个地址,当执行完下边的代码:

khalil.Look = "strong";//khalil想变得强壮一点


其中一个对象的地址发生改变,另一个肯定也发生改变,因为两个所指向的地址是一样的,如下图(红色箭头):


         今天这个小例子给以让我们很清晰的看出来值类型和引用类型在传递参数时的区别,虽然对于这部分知识总结了三篇博客,但还得加深理解,随着实践在慢慢摸索吧!~~~

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值