要了解值型別和參照型別,我們首先要知道堆和棧的區別:
① 棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義;堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小
②存放在棧中時要管儲存順序,保持著先進後出的原則,它是一片連續的記憶體域,由系統自動分配和維護。
而堆是無序的,它是一片不連續的記憶體域由有使用者自己來控制和釋放,如果使用者自己不釋放的話,當記憶體達到一定的特定值時,透過垃圾回收器(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的值並沒有變化。
「在看」和轉發是對我最大的支持!