前言
這系列的學(xué)習(xí)筆記主要是根據(jù)唐老獅的unity實(shí)戰(zhàn)路線課程整理的,加入了自己的一些補(bǔ)充和理解,該課程涉及的知識(shí)內(nèi)容非常多,我并未學(xué)完,而是根據(jù)就業(yè)需求挑選學(xué)習(xí)的,也對(duì)后續(xù)框架部分進(jìn)行了一些修改,希望能通過整理并時(shí)常閱讀這些筆記鞏固開發(fā)知識(shí),也希望能跟在學(xué)習(xí)unity的小伙伴一起分享、探討,筆記中有疑問或出錯(cuò)的部分也希望大佬們能夠給予指導(dǎo)鴨~??
一、面向?qū)ο缶幊?/h2>
面向?qū)ο缶幊蹋∣OP):是一種編程范式,這個(gè)程序以對(duì)象作為思考單元,以現(xiàn)實(shí)世界的實(shí)體和行為為模型,使得程序結(jié)構(gòu)更加接近現(xiàn)實(shí)世界的運(yùn)作方式。
面向?qū)ο缶幊痰膬?yōu)勢(shì)有哪些:
(1)易維護(hù)性:oop的三大特性,提高了代碼的可讀性和模塊化程度,在維護(hù)時(shí)往往只集中在局部模塊,降低了維護(hù)成本
(2)高復(fù)用性:功能被封裝在一個(gè)個(gè)類中,這些類可以作為獨(dú)立的實(shí)體存在,便于在不同的項(xiàng)目中復(fù)用,開發(fā)者可以利用現(xiàn)有的、已經(jīng)經(jīng)過測(cè)試的類來構(gòu)建新的系統(tǒng)
(3)可擴(kuò)展性:由于繼承和多態(tài)的特性,開發(fā)者可以在不改變?cè)写a結(jié)構(gòu)的基礎(chǔ)上增加新的功能
(4)更接近日常生活和自然的思考方式,開發(fā)者可以通過對(duì)現(xiàn)實(shí)世界事物的理解來創(chuàng)建類,這樣可以更快捷地編寫代碼,提高效率
二、面向?qū)ο缶幊倘筇匦?/h2>
(一)封裝
封裝是指將對(duì)象的實(shí)現(xiàn)細(xì)節(jié)隱藏起來,只向外界暴露必要的操作接口,這樣可以降低腳本間的耦合性,提高代碼的安全性。具體代碼中的實(shí)現(xiàn)包括:使用訪問修飾符、定義接口或抽象類,使用委托和事件等等
1.類和對(duì)象
(1)什么是類
概念:具有相同特征、具有相同行為、一類事物的抽象。類是對(duì)象的模板,可以通過類創(chuàng)造出對(duì)象。
關(guān)鍵詞:class
(2)類的聲明
聲明位置:namespace
類聲明的語法:
class 類名
{
//特征--成員變量
//行為--成員方法
//保護(hù)特征--成員屬性
//構(gòu)造函數(shù)和析構(gòu)函數(shù)
//索引器
//運(yùn)算符重載
//靜態(tài)成員
}
【注】同一個(gè)語句塊中類不能重名
(3)什么是(類)對(duì)象
A、類的申明 與 類對(duì)象的申明 是兩個(gè)概念,類的申明相當(dāng)于申明了一個(gè)自定義變量類型(類似枚舉和結(jié)構(gòu)體的申明)是申明對(duì)象的模板,用來抽象顯示事物的,而 對(duì)象 是類創(chuàng)建出來的,相當(dāng)于申明一個(gè)指定類的變量,是用來表示現(xiàn)實(shí)中的對(duì)象個(gè)體的。
B、類創(chuàng)建對(duì)象的過程 一般稱為實(shí)例化對(duì)象,實(shí)例化一個(gè)類對(duì)象就是在申明變量。
C、類對(duì)象都是引用類型的
(4)實(shí)例化(類)對(duì)象的語法
語法:
//類名 變量名;
//類名 變量名=null; (null代表空)
//類型 變量名=new 類名();
示例:
(5)類和結(jié)構(gòu)體的區(qū)別
區(qū)別概述
存儲(chǔ)上:
結(jié)構(gòu)體和類最大的區(qū)別是在存儲(chǔ)空間上的,結(jié)構(gòu)體是值類型,類是引用類型,一個(gè)存儲(chǔ)在棧上一個(gè)在堆上,值和引用對(duì)象在賦值上就有區(qū)別。
使用上:
結(jié)構(gòu)體和類在使用上很類似,結(jié)構(gòu)體具備面向?qū)ο笏枷胫蟹庋b的特性,但是它不具備繼承和多態(tài)的特性,也由于結(jié)構(gòu)體不具備繼承的特性,它不能使用protected訪問修飾符細(xì)節(jié)區(qū)別
1、結(jié)構(gòu)體是值類型,類是引用類型
2、結(jié)構(gòu)體存儲(chǔ)在棧中,類存儲(chǔ)在堆中
3、結(jié)構(gòu)體不能被繼承,類可以
4、結(jié)構(gòu)體成員不能使用protected訪問修飾符,而類可以
5、結(jié)構(gòu)體成員變量聲明不能指定初始值,類可以
6、結(jié)構(gòu)體不能聲明無參的構(gòu)造函數(shù),類可以
7、結(jié)構(gòu)體聲明有參構(gòu)造函數(shù)后,無參構(gòu)造函數(shù)不會(huì)被頂?shù)?br> 8、結(jié)構(gòu)體不能聲明析構(gòu)函數(shù),類可以
9、結(jié)構(gòu)體需要在構(gòu)造函數(shù)中初始化所有成員變量,類隨意
10、結(jié)構(gòu)體不能被靜態(tài)static修飾(不存在靜態(tài)結(jié)構(gòu)體),類可以
11、結(jié)構(gòu)體不能在自己內(nèi)部聲明和自己一樣的結(jié)構(gòu)體變量,類可以
如何選擇結(jié)構(gòu)體和類
1、想要用繼承和多態(tài)時(shí),直接淘汰掉結(jié)構(gòu)體,比如玩家、怪物等
2、對(duì)象是數(shù)據(jù)集合時(shí),優(yōu)先考慮結(jié)構(gòu)體,比如位置、坐標(biāo)等
3、從值類型和引用類型賦值時(shí)的區(qū)別上考慮,比如經(jīng)常被賦值傳遞的對(duì)象,并且改變賦值對(duì)象,原對(duì)象不想跟著變化時(shí),就用結(jié)構(gòu)體,比如坐標(biāo)、向量、旋轉(zhuǎn)等等
2.成員變量和訪問修飾符
(1)成員變量基本規(guī)則
A、申明在類語句塊中
B、用來描述對(duì)象特征
C、可以是任意類型的變量,數(shù)量不限
D、是否賦值根據(jù)需求來定
(2)實(shí)例
聲明:
使用:(知識(shí)點(diǎn):類對(duì)象實(shí)例化+成員變量初始值+成員變量使用)
3.成員方法
(1)成員方法(函數(shù))的聲明
A、申明在類語句塊中
B、用來描述對(duì)象的行為
C、規(guī)則與函數(shù)申明規(guī)則相同,受到訪問修飾符的影響
D、返回值參數(shù)不作限制、方法數(shù)量不做限制
【注1】成員方法不加static關(guān)鍵字
【注2】成員方法必須實(shí)例化出對(duì)象,再通過對(duì)象來使用,相當(dāng)于該對(duì)象執(zhí)行了某種行為
(2)成員方法(函數(shù))的使用
也可將某類作為參數(shù)傳入另一個(gè)類的方法中,建立兩個(gè)類之間的聯(lián)系:
4.構(gòu)造函數(shù)、析構(gòu)函數(shù)和垃圾回收機(jī)制
(1)構(gòu)造函數(shù)
基本概念:在實(shí)例化對(duì)象時(shí)會(huì)調(diào)用的,用于初始化的函數(shù),如果不寫,默認(rèn)存在一個(gè)無參構(gòu)造函數(shù)(類中允許自己申明無參構(gòu)造函數(shù),結(jié)構(gòu)體中必須有參)
寫法:沒有返回值(void都沒有);函數(shù)名與類名必須相同;沒有特殊需求時(shí)一般都是public;構(gòu)造函數(shù)可以被重載;this代表當(dāng)前調(diào)用該函數(shù)的對(duì)象自己
【注】若不申明構(gòu)造函數(shù)的話,默認(rèn)會(huì)有一個(gè)無參構(gòu)造函數(shù),不過一旦申明了有參的構(gòu)造函數(shù),原先默認(rèn)的無參的構(gòu)造函數(shù)就會(huì)被頂?shù)?,此時(shí)再直接new 類名() 就會(huì)報(bào)錯(cuò),但如果又自己申明了一個(gè)無參的構(gòu)造函數(shù),那該句就不會(huì)報(bào)錯(cuò)了,成員變量初始值就會(huì)是無參構(gòu)造函數(shù)里定義的初始值
(3)析構(gòu)函數(shù)(了解即可)
基本概念:當(dāng)引用類型的堆內(nèi)存被回收時(shí),會(huì)調(diào)用該函數(shù)
基本語法:~類名(){}
【注】c#中存在自動(dòng)垃圾回收機(jī)制GC,所以基本不會(huì)使用析構(gòu)函數(shù),除非想在某個(gè)對(duì)象被垃圾回收時(shí)做一些特殊處理
(4)垃圾回收機(jī)制
什么是垃圾:
檢測(cè)所有對(duì)象,當(dāng)一個(gè)對(duì)象沒有被任何變量持有,它就是垃圾,在檢測(cè)完之后,所有垃圾都會(huì)被回收,釋放內(nèi)存。
為什么會(huì)有垃圾回收:
為了避免內(nèi)存溢出,GC會(huì)定期執(zhí)行垃圾回收,回收分配給沒有 有效引用 的對(duì)象的內(nèi)存。
GC負(fù)責(zé)的范圍:
GC只負(fù)責(zé)堆(Heap)內(nèi)存的垃圾回收,棧(Stack)上的內(nèi)存是由系統(tǒng)自動(dòng)管理的
觸發(fā)垃圾回收的時(shí)機(jī):
A、系統(tǒng)每隔一段時(shí)間就會(huì)自動(dòng)觸發(fā)(每個(gè)平臺(tái)上間隔時(shí)間不一樣)
B、當(dāng)系統(tǒng)內(nèi)存不足的時(shí)候就會(huì)觸發(fā)
C、可以調(diào)用Unity中的API手動(dòng)觸發(fā)(GC.Collect();)
為什么要減少垃圾(GC帶來的問題):
垃圾回收的執(zhí)行者是CPU,當(dāng)垃圾越多,GC就會(huì)越頻繁,CPU負(fù)擔(dān)越大,內(nèi)存越碎片化,GC也就會(huì)更頻繁地被觸發(fā)
如何減少垃圾(避免垃圾回收):
A、減少new的使用,并且緩存有必要的變量(比如盡量不要在update中new對(duì)象)
B、使用對(duì)象池技術(shù),盡量提高每一個(gè)對(duì)象的復(fù)用率
C、使用公用的對(duì)象(即靜態(tài)成員static,但要謹(jǐn)慎使用)
D、避免裝箱拆箱的操作
E、其他一些小技巧,比如將String換成StringBuilder拼接字符串,string容易導(dǎo)致內(nèi)存泄露
手動(dòng)觸發(fā)垃圾回收:
GC.Collect();
垃圾回收時(shí)會(huì)造成游戲卡頓,所以一般不會(huì)頻繁調(diào)用,一般都是在內(nèi)存滿了或是loading過場(chǎng)景時(shí)使用函數(shù)進(jìn)行垃圾回收
5.成員屬性
(1)作用
作用:A、用于保護(hù)成員變量;B、為成員屬性的獲取和賦值添加邏輯處理;C、解決3p的局限性—— 讓成員變量在外部 只能獲取不能修改,或是 只能修改不能獲取
(2)基本語法
//訪問修飾符 屬性類型 屬性名
//{
// get{}
// set{}
//}
【注1】get和set可以只有一個(gè)(一般是只有g(shù)et,就是只能得不能改)
【注2】get和set前可以加訪問修飾符(默認(rèn)不加,會(huì)使用屬性聲明時(shí)的訪問權(quán)限,并且加的訪問修飾符權(quán)限要低于屬性的訪問修飾符權(quán)限,但不能讓get和set的訪問權(quán)限都低于屬性的權(quán)限)
實(shí)例:
(3)自動(dòng)屬性
如果類中有一個(gè)特征是只希望外部能得不能改的,又沒什么特殊處理,那么就可以直接使用自動(dòng)屬性對(duì)其進(jìn)行包裝
public float Height
{
//沒有在get和set中寫邏輯的需求或想法
get;
set;
}
6.索引器
(1)基本概念和語法
基本概念:讓對(duì)象像數(shù)組一樣通過索引器訪問其中的元素,使程序簡(jiǎn)潔美觀
語法:
//訪問修飾符 返回值 this[參數(shù)類型 參數(shù)名, 參數(shù)類型 參數(shù)名]
//{
// 內(nèi)部的寫法和規(guī)則 與 索引器相同
// get{}
// set{}
//}
實(shí)例:
(2)索引器中可以寫邏輯
(3)索引器重載(可以有多個(gè)索引器)
7.靜態(tài)成員
(1)基本概念
用static關(guān)鍵字修飾的 成員變量、方法、屬性等就稱為靜態(tài)成員 。
靜態(tài)成員的特點(diǎn):用 類名點(diǎn)出來直接使用,不需要實(shí)例化
(2)自定義靜態(tài)成員
定義:
使用:(靜態(tài)成員不用實(shí)例化,直接類名點(diǎn)出來即可)
(3)使用靜態(tài)成員的注意點(diǎn)
【注1】static和訪問修飾符的順序無所謂
【注2】為什么靜態(tài)成員可以不經(jīng)過實(shí)例化直接點(diǎn)出來就能使用呢:
我們要使用的對(duì)象都是要在內(nèi)存中分配內(nèi)存空間的,之所以要實(shí)例化對(duì)象,目的就是分配內(nèi)存空間,在程序中產(chǎn)生一個(gè)抽象的對(duì)象。
而靜態(tài)成員的特點(diǎn)就是在程序開始運(yùn)行時(shí)就會(huì)分配內(nèi)存空間,并且直到程序結(jié)束時(shí)內(nèi)存空間才會(huì)被釋放。
所以一個(gè)靜態(tài)成員就會(huì)有自己唯一一個(gè)的“內(nèi)存小房間”(即 靜態(tài)存儲(chǔ)區(qū))。
這讓靜態(tài)成員有了唯一性,我們?cè)谌魏蔚胤蕉际怯玫男》块g里的內(nèi)容,就也能直接點(diǎn)出來使用了。
這也是不經(jīng)常使用靜態(tài)的原因:靜態(tài)存儲(chǔ)區(qū)占用內(nèi)存太大,又無法GC,動(dòng)態(tài)內(nèi)存占比小,GC太過頻繁會(huì)造成程序卡頓
【注3】靜態(tài)函數(shù)中不能使用非靜態(tài)成員 :非靜態(tài)成員變量必須要實(shí)例化出來后才能使用,不能無中生有,非要在靜態(tài)函數(shù)中使用的話,就要在函數(shù)中實(shí)例化
【注4】非靜態(tài)函數(shù)可以使用靜態(tài)成員
(4)靜態(tài)成員的作用
A、常用唯一變量的聲明 / 常用唯一的方法聲明(比如相同規(guī)則的數(shù)學(xué)計(jì)算函數(shù))
B、方便別人獲取的對(duì)象聲明
(5)靜態(tài)成員和常量的區(qū)別
const(常量)可以理解為特殊的static(靜態(tài)),他們的相同點(diǎn)在于都可以通過類名點(diǎn)出直接使用,區(qū)別主要在于:
A、const必須初始化,不能修改,static沒有這個(gè)限制
B、const只能修飾變量,static可以修飾變量、方法、屬性等很多
C、const一定是寫在訪問修飾符后面的,static沒有這個(gè)要求
(6)例題(單例模式初探)
請(qǐng)實(shí)現(xiàn)一個(gè)類對(duì)象,在整個(gè)應(yīng)用程序的生命周期中,有且僅會(huì)有一個(gè)該對(duì)象存在,不能在外部實(shí)例化,直接通過該類的類名就能夠得到唯一的對(duì)象:
8.靜態(tài)類和靜態(tài)構(gòu)造函數(shù)(方法)
(1)靜態(tài)類
概念:用static修飾的類,只能包含靜態(tài)成員,不能被實(shí)例化
作用:將常用的靜態(tài)成員寫在該類中,方便使用;靜態(tài)類不能被實(shí)例化更能體現(xiàn)工具類的唯一性。比如console就是一個(gè)靜態(tài)類
(2)靜態(tài)構(gòu)造函數(shù)
概念:用static修飾的構(gòu)造函數(shù)
特點(diǎn):
A、靜態(tài)類和普通類都可以有
B、不能使用訪問修飾符
C、不能有修改
D、只會(huì)自動(dòng)調(diào)用一次
作用:在靜態(tài)構(gòu)造函數(shù)中初始化靜態(tài)變量
使用:
9.拓展方法
(1)基本概念
基本概念:為現(xiàn)有非靜態(tài) 變量類型 添加新方法
作用:
A、提升程序拓展性;
B、不需要再在對(duì)象中重新寫方法;
C、不需要繼承來添加方法;
D、為別人封裝的類型寫額外的方法
特點(diǎn):
A、一定寫在靜態(tài)類中
B、一定是個(gè)靜態(tài)函數(shù)
C、第一個(gè)參數(shù)為拓展目標(biāo)
D、第一個(gè)參數(shù)用this修飾
(2)語法
//訪問修飾符 static 返回值 函數(shù)名(this 拓展類名 參數(shù)名,參數(shù)類型 參數(shù)名,參數(shù)類型 參數(shù)名,...)
(3)實(shí)例(為自定義的類拓展方法)
【注】若拓展方法名與原有方法名重名了的話,那能用的是原方法,相當(dāng)于拓展方法沒有用了
10.運(yùn)算符重載
(1)基本概念
基本概念:讓自定義類和結(jié)構(gòu)體能夠使用運(yùn)算符。
關(guān)鍵字: operator
特點(diǎn):一定是一個(gè)公共的靜態(tài)方法,返回值要寫在operator前,邏輯處理自定義
注意點(diǎn):條件運(yùn)算符需要成對(duì)實(shí)現(xiàn);一個(gè)符號(hào)可以多個(gè)重載;不能使用ref和out
(2)實(shí)例
11.內(nèi)部類和分部類
(1)內(nèi)部類基本概念
基本概念:在一個(gè)類中再申明一個(gè)類。在使用時(shí)要用包裹著點(diǎn)出自己。
【注】默認(rèn)內(nèi)部類是私有的,要想在外部訪問要用public。
(2)分部類基本概念
基本概念:把一個(gè)類分成幾部分申明。作用在于:分部描述一個(gè)類,增加程序的可拓展性
關(guān)鍵字:partial
(3)分部方法
基本概念:將方法的聲明和實(shí)現(xiàn)分離
特點(diǎn):不能加訪問修飾符,默認(rèn)私有;只能在分部類中聲明;返回值只能是void;可以有參數(shù)但不能用out關(guān)鍵字
(二)繼承
繼承是指允許新創(chuàng)建的類繼承現(xiàn)有類的屬性和方法,這樣可以提高代碼的復(fù)用率和可擴(kuò)展性。
1.繼承的基本規(guī)則
(1)基本概念
一個(gè)類A繼承類B,類A將會(huì)繼承類B的所有成員,A類將擁有類B的所有特征和行為。子類只能有一個(gè)父親;子類可以間接繼承父類的父類。
(2)語法
class 類名:被繼承的類名
(3)訪問修飾符的影響——protected
父類用了private, 子類中雖也包含這個(gè)成員,但不能直接使用。但父類使用protected的話,外部不允許訪問,但子類是可以使用的 。
【注】極不建議父類和子類使用相同名稱的成員,非要使用要加上new關(guān)鍵字
2.里氏替換原則
(1)基本概念
基本概念:任何父類出現(xiàn)的地方,子類都可以替代;
語法表現(xiàn):父類容器裝子類對(duì)象,因?yàn)樽宇悓?duì)象包含了父類所有內(nèi)容
作用:方便進(jìn)行對(duì)象的存儲(chǔ)和管理。通常會(huì)用到數(shù)組+is+as,用一個(gè)基類容器來存儲(chǔ)場(chǎng)景中的各種對(duì)象,然后通過條件判斷來決定各個(gè)對(duì)象應(yīng)該處理什么樣的邏輯。
(2)實(shí)現(xiàn)
但此時(shí)player等對(duì)象是不能用Player類中特有的方法的,需要用is+as來進(jìn)行轉(zhuǎn)換
(3)is 和 as
is:判斷一個(gè)對(duì)象是否是指定類對(duì)象。返回值是bool類型
as:將一個(gè)對(duì)象轉(zhuǎn)換為指定類對(duì)象。轉(zhuǎn)換成功則返回值是指定類型對(duì)象,失敗則返回null
基本語法:
//類對(duì)象 is 類名
//類對(duì)象 as 類名
【注】一般is 和 as會(huì)配合使用:(對(duì)于數(shù)組里氏替換原則很好用)
3.繼承中的構(gòu)造函數(shù)
(1)基本概念
在申明一個(gè)子類對(duì)象時(shí),會(huì)先調(diào)用父類的構(gòu)造函數(shù),再調(diào)用子類的構(gòu)造函數(shù)
(2)父類的無參構(gòu)造函數(shù)很重要
子類實(shí)例化時(shí)默認(rèn)調(diào)用的是父類的無參構(gòu)造函數(shù),所以如果父類的無參構(gòu)造函數(shù)被頂?shù)袅说脑挘?gòu)造函數(shù)的重載),會(huì)報(bào)錯(cuò)
(3)base關(guān)鍵字
子類可以通過base關(guān)鍵字 (base就指代父親) 調(diào)用父類含有某個(gè)參數(shù)的構(gòu)造函數(shù)。不想實(shí)例化時(shí)調(diào)用默認(rèn)的父類的無參構(gòu)造函數(shù),而是指定調(diào)用某一個(gè)有參構(gòu)造函數(shù),就要用base關(guān)鍵字
4.萬物之父和裝箱拆箱
(1)基本概念
基本概念:object是所有類型的父類,它是一個(gè)類(引用類型)。
作用:可以利用里氏替換原則,用object容器裝所有對(duì)象;可用來表示不確定類型,作為函數(shù)參數(shù)類型
(2)裝箱和拆箱
發(fā)生條件:用object存值類型就稱為裝箱,再把object轉(zhuǎn)為值類型就稱為拆箱。
進(jìn)一步理解:裝箱的過程,就是把值類型用引用類型來存儲(chǔ),棧內(nèi)存會(huì)遷移到堆內(nèi)存中;拆箱的過程,就是把引用類型存儲(chǔ)的值類型取出來,堆內(nèi)存會(huì)遷移到棧內(nèi)存中。
好處:不確定類型時(shí)可以方便參數(shù)的存儲(chǔ)和傳遞。
壞處:存在內(nèi)存遷移,增加了性能消耗
舉例:
5.密封類
(1)基本概念
用sealed密封關(guān)鍵字修飾的類,其作用是讓該類無法再被繼承
(2)作用
密封類主要作用就是不允許最底層子類被繼承,這樣可以保證程序的規(guī)范性和安全性
(三)多態(tài)
多態(tài)是指允許不同的對(duì)象對(duì)同一消息作出不同的響應(yīng),這個(gè)概念主要體現(xiàn)在父類和子類、接口的多種實(shí)現(xiàn)中。應(yīng)用場(chǎng)景比如說角色的行為模式的切換、碰撞檢測(cè)、事件處理等等.
1.虛方法
之前學(xué)到的函數(shù)重載就是多態(tài)的其中一個(gè)表現(xiàn),現(xiàn)在學(xué)習(xí)的是虛方法:用virtual關(guān)鍵字修飾的函數(shù)是虛函數(shù),可以被用override關(guān)鍵字修飾的子類重寫
2.抽象類和抽象方法
(1)基本概念
基本概念:用關(guān)鍵字abstract修飾的類。其特點(diǎn)是:
A、不能被實(shí)例化,但符合里氏替代原則,用抽象類容器裝子類對(duì)象;
B、可以包含抽象方法;
C、繼承抽象類必須重寫其抽象方法
作用:父類比較抽象不希望被實(shí)例化,其中的行為不太需要被實(shí)現(xiàn)的,只希望子類去定義具體的規(guī)則的,可以選擇抽象類然后使用其中的抽象方法來定義規(guī)則
(2)抽象函數(shù)(純虛方法)
用abstract關(guān)鍵字修飾的方法
特點(diǎn):
A、只能在抽象類中申明
B、沒有方法體
C、不能是私有的
D、繼承后必須實(shí)現(xiàn),用override重寫
(3)虛方法和抽象方法的聯(lián)系與區(qū)別
1、虛方法在任意類中都能寫,但抽象方法只能寫在抽象類中
2、虛方法可由子類選擇性實(shí)現(xiàn),但抽象方法在子類中必須要實(shí)現(xiàn)
3、虛方法和抽象方法都可以被無限重寫(子類的子類的子類…都可以重寫該方法)
3.接口
(1)基本概念與規(guī)范
基本概念:接口是行為的抽象規(guī)范,也是一種自定義的類型。
關(guān)鍵字:interface
特點(diǎn):和類的申明類似,接口是用來繼承的,不能被實(shí)例化,但是可以作為容器存儲(chǔ)對(duì)象
接口申明的規(guī)范:
1、不包含成員變量
2、只包含方法、屬性、索引器、事件
3、成員不能被實(shí)現(xiàn)
4、成員可以不用寫訪問修飾符,不能是私有的
5、接口不能繼承類,但是可以繼承另一個(gè)接口
接口使用的規(guī)范:
1、類可以繼承多個(gè)接口
2、類繼承接口后,必須實(shí)現(xiàn)接口中所有成員
(2)聲明語法
//interface 接口名
//{
//}
【注】接口名的命名規(guī)范一般是在帕斯卡命名前加一個(gè)I
實(shí)例:
(3)顯式實(shí)現(xiàn)接口
當(dāng)一個(gè)類繼承2個(gè)接口,但是接口中存在同名的方法時(shí),需要顯示實(shí)現(xiàn)接口,就是用接口名.行為名來實(shí)現(xiàn),但是在實(shí)現(xiàn)方法時(shí)需要先用as轉(zhuǎn)為指定的接口類型才能調(diào)用方法
【注】顯示實(shí)現(xiàn)接口時(shí),不能寫訪問修飾符
(4)抽象類和接口的區(qū)別
相同點(diǎn):
A、都可以被繼承;
B、都不能被實(shí)例化;
C、都可以包含方法的申明;
D、子類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法;
E、都遵循里氏替換原則
區(qū)別:
A、抽象類中可以有構(gòu)造函數(shù),接口中不能;
B、抽象類只能被單一繼承,接口可以被多個(gè)繼承;
C、抽象類中可以有成員變量,接口不能;
D、抽象類中可以申明成員方法、虛方法、抽象方法、靜態(tài)方法,而接口中只能申明沒有實(shí)現(xiàn)的方法;
E、抽象類方法可以使用訪問修飾符,接口中建議不寫,默認(rèn)為public
如何選擇抽象類和抽象方法:
表示對(duì)象的用抽象類,表示行為拓展的用接口,不同對(duì)象擁有共同的行為,往往可以用接口來實(shí)現(xiàn)(例如:動(dòng)物是一類對(duì)象,自然會(huì)選擇抽象類,而飛翔是一個(gè)行為,自然會(huì)選擇接口)
4.密封方法
基本概念:用sealed修飾的重寫函數(shù),和override一起出現(xiàn)
作用:讓虛方法或者抽象方法不能再被重寫
三、面向?qū)ο缶幊唐叽笤瓌t
1.七大原則要實(shí)現(xiàn)的目標(biāo)
目標(biāo):高內(nèi)聚、低耦合,使程序模塊的可重用性、移植性增強(qiáng)。
高內(nèi)聚低耦合:從類的角度來看,就是減少類內(nèi)部 對(duì)其他類的調(diào)用;從功能模塊上來看,就是減少模塊(功能,如UI功能、戰(zhàn)斗功能等)之間的交互復(fù)雜度
2.七大原則概念
四、面向?qū)ο蟮钠渌嚓P(guān)知識(shí)
1.命名空間
基本概念:命名空間是用來組織代碼的,就像是一個(gè)工具包,類就像是一件件工具,都是聲明在命名空間中的
使用關(guān)鍵字:using
【注1】不同命名空間中相互使用,需要引用命名空間或指明出處
【注2】命名空間可以重名,但重名的命名空間下類的名稱不能相同。在不同名的命名空間中是可以有同名類的,但此時(shí)要點(diǎn)出出處(命名空間.類名)
【注3】命名空間可以包裹命名空間(工具包中的小工具包),同理注意用點(diǎn)來指明出處
2.萬物之父中的方法
(1)object中的靜態(tài)方法:Equals 和 ReferenceEquals
靜態(tài)方法Equals :用來判斷兩個(gè)對(duì)象是否相等,最終的判斷圈交給左側(cè)對(duì)象的Equals方法(不管值類型還是引用類型都按照左邊對(duì)象的Equals方法的規(guī)則進(jìn)行比較)
靜態(tài)方法ReferenceEquals :用來比較兩個(gè)對(duì)象是否是相同的引用,主要用來比較引用類型對(duì)象,值類型對(duì)象返回值始終是false
(2)object中的成員方法:GetType 和 MemberwiseClone
GetType:獲取對(duì)象運(yùn)行時(shí)的類型Type,通過Type結(jié)合后續(xù)反射相關(guān)知識(shí)點(diǎn)可以做很多關(guān)于對(duì)象的操作
MemberwiseClone:用于獲取對(duì)象的淺拷貝對(duì)象,即返回一個(gè)新的對(duì)象,新對(duì)象中的引用變量會(huì)和老對(duì)象一致
3.String中的方法
//字符串指定位置獲取
string str="xiaoliang";
Console.WriteLine(str[0]);
//字符串拼接:Format
str=string.Format("{0}{1}",1,2222);
//正向查找字符串所在的位置(從0開始,沒找到默認(rèn)返回-1):IndexOf
string str="xiaoliang";
int index=str.IndexOf("a")
Console.WriteLine(index);
//反向查找字符串所在的位置(可以查找一組詞):LastIndexOf
string str=我是小梁小梁";
int index=str.LastIndexOf("小梁");
Console.WriteLine(index);
//移除指定位置及這之后的所有字符:Remove
//【注1】string修改后是會(huì)創(chuàng)建一個(gè)新的對(duì)象,原來的對(duì)象并不會(huì)跟著變,所以要賦值給一個(gè)對(duì)象
string str="xiaoliang";
str.Remove(3);
Console.WriteLine(str);
//【注2】傳入2個(gè)參數(shù)的話可以在中間指定位置截?。ò付ǖ哪莻€(gè)位置的字符):
//參數(shù)1:開始位置 參數(shù)2:字符個(gè)數(shù)
str=str.Remove(1,1);
//替換指定字符串:Replace
string str="xiaoliang";
str.Replace("liang","hong");
//大小轉(zhuǎn)換:ToUpper ToLower
string str="xiaoliang";
str.ToUpper();
//字符串截?。ò付ㄎ恢米址篠ubstring
string str="xiaoliang";
str.Substring(2);
//【注】也可以傳入兩個(gè)參數(shù),截取中間一節(jié),不會(huì)自動(dòng)的幫助判斷是否越界
//字符串切割:Split
string str="1,2,3,4,5,6";
string[] strs=str.Splite(',');
4.stringBuilder
string是很特殊的引用,每次重新賦值或者拼接時(shí)會(huì)重新分配新的內(nèi)存空間,所以如果一個(gè)字符串經(jīng)常改變會(huì)非常浪費(fèi)空間,而StringBuilder就是來解決這個(gè)問題的。
(1)基本概念
StringBuilder是c#提供的一個(gè)處理字符串的公共類,主要解決的問題是:修改字符串而不創(chuàng)建新的對(duì)象,需要頻繁修改和拼接的字符串可以用它,可以提升性能,優(yōu)化內(nèi)存
【注1】在使用前需要引用命名空間:System.Text
【注2】在擴(kuò)容時(shí)還是會(huì)開房間從而產(chǎn)生垃圾,但只要容量夠,在改變字符時(shí)就不會(huì)重新開房間
(2)增、拼接、插入、刪、查、改、替換
文章來源:http://www.zghlxwxcb.cn/news/detail-831275.html
(3)string 和 stringBuilder的區(qū)別
string每次修改拼接時(shí)會(huì)重新分配內(nèi)存空間,產(chǎn)生垃圾,而stringBuilder修改字符串時(shí)不會(huì)創(chuàng)建新的對(duì)象,因此需要頻繁修改和拼接的字符串可以用stringBuilder,可以提升性能。但string提供了更多方法供使用,需要使用這些特殊方法來處理一些特殊邏輯時(shí)可以使用string。文章來源地址http://www.zghlxwxcb.cn/news/detail-831275.html
到了這里,關(guān)于Unity學(xué)習(xí)筆記(零基礎(chǔ)到就業(yè))|Chapter03:C#核心的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!