值类型引用类型、值传递引用传递探讨

和同事喋喋不休,吵个不停,于是查阅文档,复习相关的值类型和引用类型、值传递和引用传递,总结分享!如有错误还望指正!一个人思想有限,集思广益,共同发展。

值类型和引用类型

首先分清C#中的值类型和引用类型的区分:

值类型包括:intchardoublefloatlongshortbyteboolenumstructdecimal

值类型都是派生自ValueType ValueType 是抽象类

值类型不能继承,只能实现接口。

②string、数组、类(自定义数据类型)、接口、委托、

int[] n={1,2,3};//引用类型。

引用类型都派生自:Object

引用类型可以继承(类之间可以继承)

需要知道和明白的规律

1、记住声明变量都在栈上

2、值类型声明变量之后,不管值是多大多小,变量大小固定,存在栈上

3、引用类型声明变量之后,取决于值的多少!大小不固定,存放在栈和堆上

值传递案例如下:

    class Program
    {
        static void Main(string[] args)
        {
            //1.值类型=====
            //int n = 10;
            //int m = n;
            //m++;
            //Console.WriteLine(n);
            //Console.ReadKey();

            //2.引用类型========
            //Person p = new Person();
            //p.Age = 17;
            //p.Name = "johnson";
            //p.Email = "johnsondzd@qq.com";

            //Person p1 = p;
            //p1.Age = p.Age + 12;
            //Console.WriteLine(p.Age);
            //Console.ReadKey();

            //案例1
            //int m = 1;
            //M1(m);//值类型作为参数传递的时候是【拷贝了一个副本】,所以改变副本不影响原来的内容
            //Console.WriteLine(m);
            //Console.ReadKey();

            //案例2
            //int[] arrInt = { 1, 3, 5, 7, 9, };
            //M2(arrInt);
            //for (int i = 0; i < arrInt.Length; i++)
            //{
            //    Console.WriteLine(arrInt[i]);
            //}
            //Console.ReadKey();

            //案例3
            //int[] arrInt = { 1, 3, 5, 7, 9, };
            //M3(arrInt);
            //for (int i = 0; i < arrInt.Length; i++)
            //{
            //    Console.WriteLine(arrInt[i]);
            //}
            //Console.ReadKey();

            //案例4
            //Person p = new Person();
            //p.Name = "johnson";
            //p.Age = 16;
            //M4(p);
            //Console.WriteLine(p.Name);
            //Console.WriteLine(p.Age);
            //Console.ReadKey();

            //案例5
            Person p = new Person();
            p.Name = "johnson";
            p.Age = 16;
            M5(p);
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
            Console.ReadKey();
        }
        static void M5(Person per)
        {
            per = new Person();
            per.Name = "vinson";
            per.Age = 32;
        }

        static void M4(Person per)
        {
            per.Name = "vinson";
            per.Age = 32;
        }

        static void M3(int[] arr)
        {
            int[] arr1 = { 2, 4, 6 };
            arr = arr1;
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = arr[i] + 2;
            }
        }

        static void M2(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = arr[i] + 2;
            }
        }

        static void M1(int n)
        {
            n = 10;
            n++;
        }
    }

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

 

引用传递案例

    class Program
    {
        static void Main(string[] args)
        {
            //值传递:值类型、引用类型
            //引用传递:值类型、引用传递 ref

            //1、引用传递的是值类型
            //int n = 10;
            //M1(ref n);
            //Console.WriteLine(n);
            //Console.ReadKey();

            //2、引用传递的是引用类型
            Person p = new Person();
            p.Name = "johnson";
            M2(ref p);
            Console.WriteLine(p.Name);
            Console.ReadKey();
        }

        private static void M2(ref Person p)
        {
            p = new Person();
            p.Name = "vinson";
        }

        //ref表示“引用传递”,引用传递传递的不是栈中的数据(对于值类型来说,栈中直接保存数据;对于引用类型来说,栈中保存的是“对象的地址”),而是栈本身的地址
        static void M1(ref int m)
        {
            m++;
        }
    }

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

1234

作者: WM/Johnson

posted @ 2014-06-10 23:52  WTL Developers  阅读(435)  评论(0编辑  收藏  举报