和同事喋喋不休,吵個不停,於是查閱文檔,復習相關的值類型和引用類型、值傳遞和引用傳遞,總結分享!如有錯誤還望指正!一個人思想有限,集思廣益,共同發展。
值類型和引用類型
首先分清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 = "[email protected]"; //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