首页 > 学院 > 开发设计 > 正文

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

2019-11-17 03:06:47
字体:
来源:转载
供稿:网友

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

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

值类型和引用类型

首先分清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


上一篇:solr热身

下一篇:特性验证实体

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表