【C#】類和結構、棧和堆、值型別和引用型別、里氏替換
目錄
一、類和結構的區別:
二、棧和堆的區別:
1.官方解讀:
棧:
是編譯期間就分配好的記憶體空間,因此程式碼中必須就棧的大小有明確的定義;
區域性值型別變數、值型別引數等都在棧的記憶體中。
堆:
是程式執行期間動態的分配空間,可以根據程式的執行情況確定分配堆的記憶體大小。
2.自己理解(棧和堆舉例區別):
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
如何記住呢?
上邊拿吃飯舉例了,棧就像是餐館,堆就像是在家,我們去吃的都是涮羊肉。
1.棧的諧音就是沾(沾一沾吃完就走了)。
2.堆如何聯想(自己準備材料,要把刷的東西都堆在一起,吃完飯碗啥的要堆起來去刷)。
三、值型別和引用型別:
值型別 | 引用型別 |
1.變數儲存真正的資料 | 1.儲存再記憶體中的起始地址 |
2.資料儲存再棧上面 | 2.資料儲存在堆上面 |
3.Sytem.ValueType | 3.Sytem.Object |
4.不能用Null釋放 | 4.能用Null釋放 |
5.超過變數作用範圍自動釋放 | 5.有.net框架的垃圾回收器自動回收 |
6.佔用記憶體少(資料直接存棧裡) | 6.佔用記憶體多(現在棧申請地址,在存堆裡) |
7.執行速度快 | 7.執行速度慢 |
1.net中那些事值型別,那些是引用型別?
四、里氏替換
1.官方解讀
里氏替換就是子類可以替換父類,並且出現在父類能夠出現的任何地方。
反過來,父類物件是不能替換子類,需要強行轉換才可以。
2.自己理解:
父類new父類的空間,父類要轉換成子類,父類沒有子類的內容,而子類繼承了父類的一切內容,子類所需的空間要比父類多,所以父類轉換不了子類,而子類的空間大,子類空間裡包含了父類所需的內容,所以子類可以轉父類,有一些空間是沒有用到。
舉例:
父類有一個屬性和一個方法,假如佔兩個空間,子類自己也有一個屬性和一個方法,但是子類由於繼承了父類,子類相當於擁有2個屬性和2個方法,所以子類的空間會有4個,父類型別的2個加上自己的2個,所以子類可以轉換成父類,而父類不能轉換成子類。
3.型別轉換可以分為as和is兩種:
is返回的是bool值,true是能轉換,false是不能轉換。
as 如果轉換不了不報異常,返回的值為null。
4.is和as
//如果成功了就是成功,不成功返回為空
typeA is typeB //僅判斷
typeA as typeB //先判斷,再轉換
相關推薦
【C#】類和結構、棧和堆、值型別和引用型別、里氏替換
目錄 舉例: 一、類和結構的區別: 二、棧和堆的區別: 1.官方解讀: 棧: 是編譯期間就分配好的記憶體空間,因此程式碼中必須就棧的大小有明確的定義; 區域性值型別變數、值型別引數等都在棧的記憶體中。 堆:
【轉】數據結構中棧和堆---內存分配中棧和堆
heap 元素 部分 程序 記錄 ptr 區域 sdn 頭部 一、數據結構的棧和堆 首先在數據結構上要知道堆棧,盡管我們這麽稱呼它,但實際上堆棧是兩種數據結構:堆和棧。堆和棧都是一種數據項按序排列的數據結構。 1)棧就像裝數據的桶或箱子 我們先從大家比較熟悉的棧說起吧
1、【C++】類&物件/建構函式/拷貝建構函式/操作符過載/解構函式
一、C++類 & 物件 C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。 類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在
【C++】類中靜態成員的宣告、初始化
【C++】類中靜態成員的宣告、初始化 類中靜態成員的宣告 初始化 靜態資料成員值的改變 完整例子 有參考大佬 零點零一 的文章: https://blog.csdn.net/thanklife/article/details/784
【Objective-C】類與結構體的區別
只能在類裡面寫方法,不能在結構體裡面寫方法類——物件,結構體——值類——引用型別 位於棧上的指標(引用)位於堆上的實體物件結構體——值型別 例項直接位於棧中拷貝行為: classname *a = b
【C++】類和物件(4)
一、類的六個預設成員函式 下面是一個Date類,但是它類中什麼成員也沒有,這就是空類。但是它雖然看起來什麼都沒有,實際上不是的,在我們什麼都不寫的情況下,它會自動生成六個預設的成員函式。如圖所示的建構函式、解構函式、拷貝建構函式、賦值過載函式、普通物件取地址函式、const物件取地址函式這六個函
【C++】類和物件(3)—>> this指標
一、this指標的引入 我們在現實中,定義一個類都是根據一個需求來定義的。所以先來看一個常用的日期類 Date 。 class Date { public: void Print() { cout << _year << "-" << _month
【C++】類和物件(2)
一、類的作用域 類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符 指明成員屬於哪個類域。否則找不到。 class person { public: void PrintfPersonInfo(); private: char _name
【C++】類和物件(二)
一、this指標 關於this指標的一個精典回答: 當你進入一個房子後, 你可以看見桌子、椅子、地板等, 但是房子你是看不到全貌了。 對於一個類的例項來說, 你可以看到它的成員函式、成員變數, 但是例
【C++】類和物件二
定義成員函式 所有成員都必須在類內宣告,但是成員函式可以定義在類內也可以定義在類外。 std::string isbn() const { return bookno;} ??? isbn函式是如何獲得bookno成員所依賴的物件呢?緊隨引數列表之後
【C#】WebApi 添加過濾器,實現對請求參數和響應內容的日誌記錄
total exc gpo start ID json clear block pub filter的介紹 filter在Web API中經常會用到,主要用於記錄日誌,安全驗證,全局錯誤處理等;Web API提供兩種過濾器的基本類型:actionfilterattri
【C++】類模板(template)
需求:寫一個可變長度的陣列類Array,用於存放若干元素,個數未知 設計:內部動態申請一個buffer capacity:表示buffer的大小 &n
【C++】類的朋友(friend)
我把你當朋友,你就能訪問我的一切(是真的一切);但你不將我當作朋友,我就不能訪問你的一切。 定義與使用 在類A中,用friend關鍵字可以將一個全域性函式宣告為該類的“朋友”,也可以將另一個類宣告為該類的“朋友”。 (1)friend宣告語句:位置自由,一般放在類體大括號的
【C#】之 語句結構與陣列
#一、語句塊 在說語句結構和陣列之前咱們先來看看一些碎碎念——雜七雜八的語句塊 ##1、常量 常量 是程式碼中人為設定固定不變的一個元素值,聲明後可以直接使用在範圍內的程式碼當中。 常量的宣告 和變數宣告差不太多,只是在最前面加上const。 **例:**const int num =1
【C#】——類與物件
一、類和物件的區別 類:類是模型,確定物件將會擁有的特徵(屬性)和行為(方法),類是物件的型別。 類是抽象的概念,僅僅是模板,比如說“人”類 物件是一個能看得到、摸得到的具體實體 物件可以叫做類的例項(Instance) 類不佔記憶體,物件才佔記憶體 二、類的定
【C++】類的預設成員函式
1.建構函式 2.拷貝建構函式 3.解構函式、 4.運算子過載---實現一個日期計算器 c++類有6個預設成員函式:建構函式,拷貝建構函式,解構函式,賦值操作符過載。取地址操作符過載,const修飾的取地址操作符過載。其中前四個預設成員函式是我們重點研究物件
【C++】類的六大預設的成員函式 之 解構函式以及建構函式和解構函式的呼叫順序
解構函式 一.解構函式定義 解構函式也是特殊的成員函式,他的作用和建構函式相反。 class Box { public: //建構函式 Box(i
【C++】類模板的特化及型別萃取
關於C++模板的初階學習(函式模板和類模板)總結於我的另一篇部落格: https://blog.csdn.net/hansionz/article/details/83827329 類模板的特化及型別萃取 1.非型別模板引數 2.模板的特化 2
【C++】類中成員函式聲明後面接 const
const 表示對類中成員函式屬性的宣告; 表示不會修改類中的資料成員; 在編寫const成員函式時,若不慎修改了資料成員,或者呼叫了其他非const成員函式,編譯器將指出錯誤; 以下程式中,類stack的成員函式GetCount僅用於計數,從邏輯上講GetCount應
【C++】類函式呼叫this
再一次面試中,被問到,函式呼叫時是怎麼知道物件的成員資訊的,用vs除錯了一把:#include "stdafx.h" #include <string> #include <iostr