當前位置: 妍妍網 > 碼農

C# 值型別和參照型別講解

2024-02-24碼農

要了解值型別和參照型別,我們首先要知道堆和棧的區別:

① 棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義;堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小

②存放在棧中時要管儲存順序,保持著先進後出的原則,它是一片連續的記憶體域,由系統自動分配和維護。
而堆是無序的,它是一片不連續的記憶體域由有使用者自己來控制和釋放,如果使用者自己不釋放的話,當記憶體達到一定的特定值時,透過垃圾回收器(GC)來回收。

  • C#的值型別包括:結構體,列舉,可空型別,byte,short,int,long,float,double,decimal,char,bool ;值型別是儲存在數據棧上的;

  • C#的參照型別包括:陣列,使用者定義的類、介面、委托,object,字串,參照型別儲存在堆上。

  • 了解了以上區別後,我們透過例項來展示下使用的區別:

  • 參照型別舉例:下面定義兩個byte陣列,交換下下標一致的數據:

    程式碼如下:

  • staticvoidMain(string[] args) {byte[] a = newbyte[] { 1, 2, 3, 4, 5 };byte[] b = newbyte[] { 6, 7, 8, 9, 10 }; ChangeData(a, b); Console.Write($"a陣列的值:");for (int i=0;i< a.Count();i++) { Console.Write($"{a[i]} "); } Console.WriteLine("\n ***********"); Console.Write($"b陣列的值:");for (int i = 0; i < b.Count(); i++) { Console.Write($"{b[i]} "); } Console.ReadKey(); }privatestaticvoidChangeData(byte[] aaa, byte[] bbb) {int tempa = aaa.Count();int tempb = bbb.Count();int count = tempa > tempb ? tempb : tempa;byte temp = 0;for (int i = 0; i < count; i++) { temp = aaa[i]; aaa[i] = bbb[i]; bbb[i] = temp; } }

  • 執行結果:

  • 雖然我們把byte陣列傳遞給了方法 ChangeData 去處理了,但是處理完a,b的數據實作了交換,因為陣列是參照型別,所以上例中aaa和a都是指向的同一段地址,所以一個aaa改變後,a陣列的值對應的有改變了。

    值型別舉例:

    staticvoidMain(string[] args) {//byte[] a = new byte[] { 1, 2, 3, 4, 5 };//byte[] b = new byte[] { 6, 7, 8, 9, 10 };//ChangeData(a, b);//Console.Write($"a陣列的值:");//for (int i=0;i< a.Count();i++)//{// Console.Write($"{a[i]} ");//}//Console.WriteLine("\n ***********");//Console.Write($"b陣列的值:");//for (int i = 0; i < b.Count(); i++)//{// Console.Write($"{b[i]} ");//}int a = 5;int b = 8; ChangeValue(a,b); Console.WriteLine($"a的值:{a}"); Console.WriteLine($"b的值:{b}"); Console.ReadKey(); }//private static void ChangeData(byte[] aaa, byte[] bbb)//{// int tempa = aaa.Count();// int tempb = bbb.Count();// int count = tempa > tempb ? tempb : tempa;// byte temp = 0;// for (int i = 0; i < count; i++)// {// temp = aaa[i];// aaa[i] = bbb[i];// bbb[i] = temp;// }//}privatestaticvoidChangeValue(int aaa, int bbb) {int temp = aaa; aaa = bbb; bbb = temp; }

    執行結果:

    我們看值交換後aaa和bbb值變化了,原始的a和b的值並沒有變化。

    在看」和轉發是對我最大的支持!