C#中類與結(jié)構(gòu)的區(qū)別實例分析
類與結(jié)構(gòu)是C#程序設(shè)計中基本的數(shù)據(jù)類型,而初學(xué)者往往不能很好的分清二者之間的區(qū)別。本文就以附帶實例形式加以說明。具體如下:
一、基本概念:
類:引用類型,存儲在堆中,棧中存儲引用地址,在方法的傳輸中只是傳輸?shù)刂返囊?,修改指向的對象會影響原有對象的值,傳輸中消耗?nèi)存小。
結(jié)構(gòu):值類型,存儲在堆棧中,傳輸過程中傳輸整個對象的副本,修改指向?qū)ο蟮闹挡粫绊懺械膶ο?,傳輸中消耗?nèi)存大。
二、實例代碼如下:
class Program { static void Main(string[] args) { /*聲明類對象 并賦值10*/ TestClass TC1 = new TestClass(); TC1.x = 10; TC1.y = "10"; Console.WriteLine("/*聲明類對象TC1 并賦值10*/"); Console.WriteLine("TC1 x={0} y={0}", TC1.x, TC1.y); TC1.x = 20; TC1.y = "20"; Console.WriteLine("/*修改類對象 TC1 值為20*/"); Console.WriteLine("TC1 x={0} y={0}", TC1.x, TC1.y); /*執(zhí)行類傳遞 并修改傳遞后的值*/ Console.WriteLine("/*創(chuàng)建類對象 TC2 指向 TC1,并修改 值為10*/"); TestClass TC2 = TC1; TC2.x = 10; TC2.y = "10"; Console.WriteLine("/*類傳輸過程中傳遞的是存儲在堆棧中的引用地址 傳輸中消耗內(nèi)存小 并沒有傳送存儲在堆中的值 所以原有對象受到影響*/"); Console.WriteLine("TC1 x={0} y={0}", TC1.x, TC1.y); Console.WriteLine("TC2 x={0} y={0}", TC2.x, TC2.y); /*聲明結(jié)構(gòu)對象*/ Console.WriteLine("/*聲明結(jié)構(gòu)對象TS1 并賦值10*/"); TestStruct TS1 = new TestStruct(); TS1.x = 10; TS1.y = "10"; Console.WriteLine("TS1 x={0} y={0}", TS1.x, TS1.y); Console.WriteLine("/*修改結(jié)構(gòu)對象 TS1 值為20*/"); TS1.x = 20; TS1.y = "20"; Console.WriteLine("TS1 x={0} y={0}", TS1.x, TS1.y); /*執(zhí)行結(jié)構(gòu)傳遞 并修改傳遞后的值*/ Console.WriteLine("/*創(chuàng)建結(jié)構(gòu)對象 TS2 指向 TS1,并修改 值為10*/"); TestStruct TS2 = TS1; TS2.x = 10; TS2.y = "10"; Console.WriteLine("/*結(jié)構(gòu)傳輸過程中 會傳遞整個對象的副本 傳輸中消耗內(nèi)存大 所以修改對原有對象不受影響*/"); Console.WriteLine("TS1 x={0} y={0}", TS1.x, TS1.y); Console.WriteLine("TS2 x={0} y={0}", TS2.x, TS2.y); Console.ReadLine(); } } public class TestClass { public int x; public string y; } public struct TestStruct { public int x; public string y; }
代碼運行結(jié)果如下圖所示:
相關(guān)文章
c#linq里的Skip和Take實現(xiàn)分頁或遍歷
LINQ的優(yōu)勢在于它提供了一種直觀、類型安全的方式來操作各種類型的數(shù)據(jù),查詢常需要獲取一部分?jǐn)?shù)據(jù),為了實現(xiàn)這一功能,LINQ提供了Take?和Skip運算符,Take運算符用于從一個序列中返回指定個數(shù)的元素,Skip運算符用于從一個序列中跳過指定個數(shù)的元素2024-01-01