1. 程式人生 > >【C#】類和結構、棧和堆、值型別和引用型別、里氏替換

【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)棧就像裝數據的桶或箱子 我們先從大家比較熟悉的棧說起吧

1C++&物件/建構函式/拷貝建構函式/操作符過載/解構函式

一、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