值類型的變量 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; } } }