值传递与引用传递01

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

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

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

 

存储的地方:code

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

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

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

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

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

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

 

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

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

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;
            }
        }
    }
相关文章
相关标签/搜索