C# 中引用類型和 值類型

值類型:存儲在棧(stack)中,一個值類型的變量其實是一個內存地址,地址中存儲的就是值本身;包括C#的基本類型(用關鍵字int、char、float等來聲明),結構(用struct關鍵字聲明的類型),枚舉(用enum關鍵字聲明的類型。

引用類型: 存儲在堆(heap)中,一個引用類型的變量的值是一個指針,指向存儲對象的內存處;它共享一份數據,修改了引用類型的數據值,引用該地址的變量值也就都發生變化,);包括類(用class關鍵字聲明的類型)和委託(用delegate關鍵字聲明的特殊類)。

    值類型的實例通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。引用類型的對象總是在進程堆中分配(動態分配)。引用類型和值類型都繼承自System.Object類。不同的是,幾乎所有的引用類型都直接從System.Object繼承,而值類型則繼承其子類,即 直接繼承System.ValueType。

    在C#中,變量是值還是引用僅取決於其數據類型。C#的值類型包括:結構體(數值類型、bool型、用戶定義的結構體),枚舉,可空類型。C#的引用類型包括:數組,用戶定義的類、接口、委託,object,字符串。數組的元素,不管是引用類型還是值類型,都存儲在託管堆上。
    引用類型在棧中存儲一個引用,其實際的存儲位置位於託管堆。簡稱引用類型部署在託管推上。值類型總是分配在它聲明的地方:作爲字段時,跟隨其所屬的變量(實 例)存儲;作爲局部變量時,存儲在棧上。值類型在內存管理方面具有更好的效率,並且不支持多態,適合用做存儲數據的載體;引用類型支持多態,適合用於定義應用程序的行爲。

發佈了15 篇原創文章 · 獲贊 20 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章