C#中值類型和引用類型有什么區(qū)別?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務仁壽,10余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575 CLR支持兩種類型:值類型和引用類型,看起來FCL的大多數(shù)類型是引用類型,但用的最多的還是值類型。引用類型總是從托管堆中分配,在用new操作符實例一個對象,返回對象內(nèi)存地址存放在一個變量中。在使用引用類型時要了解其四個心理因素:
1.內(nèi)存必須從托管堆中分配
2.堆上分配的每個對象都有一些額外成員,這些成員在使用前必須初始化。
3.對象中的其他字節(jié)總是設為零。
4.從托管堆分配對象時,可能強制執(zhí)行一次垃圾回收。
由此可見,引用類型若是濫用勢必造成過載。再看值類型,其是輕量級類型,一般分配在線程棧上也可嵌入到引用類型對象中,承載它的變量不包含指向實例的指針,當然也不受垃圾回收器的控制,因此值類型的使用緩解了托管堆的壓力,減少了應用程序生存期內(nèi)的垃圾回收的次數(shù)。
C#中稱為‘類’的都是引用類型,而值類型都成為結構或枚舉。所有結構都是由抽象類型System.ValueType直接派生。而其本身有直接從Object派生,所有枚舉從System.Enum抽象類型派生,Enum又從ValueType派生,環(huán)環(huán)相扣啊。
在設計自己的類型時,什么時候將定義成值類型呢?
1.類型具有基元類型的行為(編譯器直接支持的數(shù)據(jù)類型(像Int32,Int64等))
2.類型不需要從其他任何類型繼承。
3.類型也不派生出其他任何類型。
4.由于值類型在作為實參或是返回值的時候,需要進行相應字段的復制,如若實例過大,會造成一定的性能損失。
所以要求類型實例較小(16字節(jié)以內(nèi)),實例較大,但不作為方法實參傳遞和從方法返回也可。
關于值類型和引用類型的區(qū)別,大致列了一下幾點:
1.引用類型處于已裝箱形式,值類型處于未裝箱形式,兩者也可通過一定方式互相轉換(具體說明會在下一篇博客中詳談)
2.值類型不應引入任何新的虛方法,所有方法都不能是抽象的,且都是隱式密封防止重寫。
3.將值類型變量賦給另一個值類型變量,會執(zhí)行逐字段復制。將引用類型的變量付給另一個引用類型,只復制內(nèi)存地址。兩個或多個引用類型變量能引用堆上的同一個對象,對一個變量執(zhí)行的操作可能影響到另一個變量引用的對象。相反,值類型變量獨立,不互相影響。
4.未裝箱的值類型不在堆上分配,所以該類型的一個實例一旦不在活動,為他們分配的存儲就會釋放,不會等待垃圾回收
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。