腳踏實地學C 2 引用型別和值型別

2022-01-11 12:06:54 字數 1312 閱讀 9516

引用型別和值型別介紹

clr支援兩種型別,引用型別和值型別兩種基本的型別;

值型別下有int、double、列舉等型別同時也可以稱為結構,如int結構型別、double結構型別,所有的值型別都是隱式密封(sealed)的,防止將乙個值型別作其他引用型別或值型別的基類。

任何成為類的都是引用型別。如string、stringbuilder都是引用型別,這兩個是引用型別,但不可以被繼承,它兩也是密封類。

引用型別和值型別的區別是:

值型別是用struct關鍵字來宣告的,引用型別是用class關鍵字來宣告的;

值型別相對於引用型別是輕量級的型別,所有成員初始化為0,因為其變數已經包含了例項的字段,且不受垃圾**器的控制和管理。

引用型別的記憶體是在託管堆中分配的,並帶有一些開銷成員(同步索引塊,型別物件指標),還要一些成員進行初始化,有可能會進行一次的垃圾**;

引用型別和值型別的記憶體分配情況(慣例是先上**後上圖)

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace referencetypeandvaluetype

", valuetype.number);

console.writeline("u_referencetype=", referencetype.number);

console.readkey();}}

//定義值型別

struct u_valuetype

//定義引用型別

通過上圖大概了解引用型別和值型別分別在棧中和託管堆如何分配的,到底是不是實際上是不是就這樣的呢?

我們可以通過即時視窗和記憶體視窗,我們可以檢視棧中存放變數的棧位址和堆中的堆位址,首先在即時視窗,輸入&號加上變數名,就可以檢視了,如果是值型別的,是沒有堆位址的,還有就是在託管堆中物件記憶體位址分配是連續的,具體是不是連續,還有待深究啊!

總結:對於值型別,棧中儲存的就是變數本身的資料,對於引用型別來說,棧中儲存的是堆中物件的位址;

值傳遞和引用傳遞,前者傳遞的是棧中變數儲存的資料,後者傳遞的是棧中變數本身的位址,引用傳遞分別可以用ref和out,ref側重於修改,out側重於輸出,ref在方法使用之前必須賦值,out在方法返回之前賦值

腳踏實地學C 4 靜態類

起因 問 靜態類可以實現介面及繼承?答 都不可以 思考 為什麼不可以呢?學習靜態類,有時我們又稱為工具類 密封抽象類 從msdn文件沒有直接靜態類的定義,這裡只能說用static 不能用於結構,只能用於類 關鍵字宣告的類,就是靜態類。靜態類與非靜態類的區別 靜態類不能例項化,就是不能通過使用 new...

腳踏實地學C 3 裝箱和拆箱

裝箱 一種接受值型別的值,根據這個值在堆中建立乙個完整的引用型別物件並返回物件的引用 堆位址 的隱式轉換 int i number 2 在棧中宣告int型別i number變數並初始化 object o number null 在棧中宣告object型別的o number變數並初始化值為null,不...

腳踏實地小組的漏洞復現報告

1.1專案背景 1.2實施目的 1 熟悉用dedecms搭建 2 熟悉burp工具的使用方法 3 會使用工具進行主機漏洞的抓包 4 通過實驗了解如何提高主機的安全性 漏洞是指使用者的windows作業系統程式或者其它應用程式在邏輯設計上的缺陷或在編寫時產生的錯誤,這個缺陷或錯誤可能被不法者或者電腦黑...