和同事喋喋不休,吵个不停,于是查阅文档,复习相关的值类型和引用类型、值传递和引用传递,总结分享!如有错误还望指正!一个人思想有限,集思广益,共同发展。
值类型和引用类型
首先分清C#中的值类型和引用类型的区分:
①值类型包括:int、char、double、float、long、short、byte、bool、enum、struct、decimal。
值类型都是派生自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; } }
作者: WM/Johnson