值传递与引用传递01

值类型的变量  VS   引用类型的变量

值类型:结构体,枚举,int、char、bool、decimal、double

引用类型:数组、自定义类、string、接口、集合、object

存储的地方:

值类型的值是存储在内存的栈当中。

引用类型的值是存储在内存的堆当中。

下图展示了值类型与引用类型在计算机中的存储方式

  值类型的 int num = 10;  在内存中,是被存储在栈上的空间中;

  引用类型的 string s = "123"; 在内存中,堆上地址为0x001001的空间中存储了 “123”,然后,栈上面存储的是堆上空间的地址 0x001001 。

  我们自定义的类 Person zs = new Person(); zs.Name = "张三";  在内存中,堆上地址为0x010101的空间中存储了zs这个对象,包括这个对象的Name属性的值。,然后,我们可以在栈上找到其在堆上的地址0x010101 。

值类型我们称之为值传递,引用类型我们称之为引用传递。

值类型和引用类型的区别:

1.  值类型和引用类型在内存上存储的地方不一样。

2.  在传递值类型和传递引用类型的时候,传递的方式不一样。

3.      int、double等类型在未赋予初值的时候,默认值为0;引用类型在未赋予初值的时候,值为null。

    class Program
    {
        static void SetPersonAge(Person p,int age) 
        {
            p._Age = age;
        }

        static void Main(string[] args)
        {
            int i = 10;
            int j = i++;//先把i的值复制一份赋给j,然后i的值再自增
            int k = j;
            j *= 2;
            Console.WriteLine("i = {0},j = {1},k = {2}",i,j,k);  

    //输出结果  i = 11,j = 20,k = 10

            Person p1 = new Person(20);
            Person p2 = p1; //p2与p1指向了同一块内存
            p1._Age++; //p1对内存中的变量进行操作后,通过p2取出变量的值,变量的值当然会发生改变
            Console.WriteLine("p1._Age = {0},p2._Age = {1},", p1._Age, p2._Age);

    //输出:p1._Age = 21,p2._Age = 21

            SetPersonAge(p2, 30);//通过函数来传递的情形也是相同的
            Console.WriteLine("After Setage.");
            Console.WriteLine("p1._Age = {0},p2._Age = {1},", p1._Age, p2._Age);
    //输出:p1._Age = 30,p2._Age = 30

        }

        public class Person
        {
            public int _Age;
            public Person(int age) 
            {
                _Age = age;
            }
        }
    }
原文地址:https://www.cnblogs.com/lcxBlog/p/4493080.html