【唐老獅】Unity系列之C#四部曲—C#核心

面向?qū)ο笕筇匦?/p>
面向?qū)ο笃叽笤瓌t
面向?qū)ο笙嚓P(guān)知識(shí)
------------------------------------------------------------------------------
面向?qū)ο蠡靖拍?/span>
把相關(guān)數(shù)據(jù)和方法組織為一個(gè)整體來(lái)看待,更貼近事物的自然運(yùn)行模式
用程序來(lái)抽象對(duì)象
類:class 關(guān)鍵字
三大特性:封裝 + 繼承 + 多態(tài)
七大原則:開閉原則、依賴倒轉(zhuǎn)原則、里氏替換原則、單一職責(zé)原則、接口隔離原則、合成復(fù)用原則、迪米特法則
------------------------------------------------------------------------------
類和對(duì)象
一般在namespace語(yǔ)句塊中
class 類名 { 成員變量; 成員方法; 成員屬性;構(gòu)造函數(shù); 析構(gòu)函數(shù);索引器;運(yùn)算符重載;靜態(tài)成員 }
class前可以加訪問(wèn)修飾符
- 同一個(gè)語(yǔ)句塊中的不同類,不能重名
- 用帕斯卡命名法命名
類的申明和類對(duì)象(變量)申明是兩個(gè)概念
類的申明類似枚舉和結(jié)構(gòu)體的申明,類的申明相當(dāng)于申明了一個(gè)自定義變量類型
類名 變量名;
類名 變量名 = null;
類名 變量名 = new 類名();
Person p; // 僅在棧中開辟一個(gè)空間儲(chǔ)存p
Person p2 = null; //同上
Person p3 = new Person(); //不僅在棧中開辟一個(gè)空間,同時(shí)在堆中也開辟了空間
------------------------------------------------------------------------------
類和對(duì)象練習(xí)題
(自己隨便舉個(gè)例子,視頻中用類寫的代碼太麻煩了)
int[] array1 = new int[] { 1, 2, 3 };
int[] array2 = array1;
array2[0] = 99;
Console.WriteLine(array1[0]);?// 輸出: 99
在這個(gè)例子中,array1
是一個(gè)數(shù)組,它包含了三個(gè)整數(shù)。array2
是 array1
的一個(gè)新的引用,所以它們都指向同一個(gè)數(shù)組。
然后我們修改了 array2[0]
的值。由于 array2
和 array1
指向的是同一個(gè)數(shù)組,所以當(dāng)我們通過(guò) array1[0]
訪問(wèn)數(shù)組的第一個(gè)元素時(shí),我們會(huì)看到已經(jīng)被修改過(guò)的值。
int[] array1 = new int[] { 1, 2, 3 };
int[] array2 = array1;
array2 = null;
Console.WriteLine(array1[0]);?// 輸出: 1
在這個(gè)例子中,即使我們把 array2
設(shè)置為 null
,array1
仍然可以正常地訪問(wèn)原來(lái)的數(shù)組。這是因?yàn)?array2
和 array1
是兩個(gè)獨(dú)立的引用,改變 array2
的指向并不會(huì)影響到 array1
。
int[] array1 = new int[] { 1, 2, 3 };
int[] array2 = array1;
array2 = new int[] { 4, 2, 3 };
Console.WriteLine(array1[0]);?// 輸出: 1
Console.WriteLine(array2[0]);?// 輸出: 4
你可以看到,盡管我們改變了 array2
的值,但是 array1
仍然保持不變,它仍然指向原來(lái)的數(shù)組。這是因?yàn)?array2
和 array1
是兩個(gè)獨(dú)立的引用,改變 array2
的指向并不會(huì)影響到 array1
。
------------------------------------------------------------------------------
成員變量和訪問(wèn)修飾符
- 申明在類語(yǔ)句塊中
- 用來(lái)描述對(duì)象特征
- 可以是任意變量類型
- 是否賦值根據(jù)需求來(lái)定
- 默認(rèn)都是private
如果要在類中申明一個(gè)和自己相同類型的成員變量時(shí)不能對(duì)它進(jìn)行初始化
--------------------------
- public 公共的,自己(內(nèi)部)和外人(外部)都能訪問(wèn)和使用
- private 私有的,自己(內(nèi)部)才能訪問(wèn)和使用,默認(rèn)
- protected 保護(hù)的,自己(內(nèi)部)和子類才能訪問(wèn)和使用
--------------------------
1.值類型的初始值:
- 數(shù)字類型:0
- 布爾值:false
- char:空字符
2. 引用類型:null
查看默認(rèn)值的代碼:default(數(shù)據(jù)類型)
------------------------------------------------------------------------------
成員方法
- 函數(shù),用來(lái)表現(xiàn)對(duì)象行為;
- 申明在類語(yǔ)句塊中,規(guī)則和函數(shù)相同,受到訪問(wèn)修飾符的影響;
- 成員方法不加static關(guān)鍵字;
- 受到訪問(wèn)修飾符影響
- 成員方法必須實(shí)例化出對(duì)象,再通過(guò)對(duì)象來(lái)使用,相當(dāng)于該對(duì)象執(zhí)行了某個(gè)行為;
------------------------------------------------------------------------------
構(gòu)造函數(shù)和析構(gòu)函數(shù)
在實(shí)例化對(duì)象時(shí),會(huì)調(diào)用的用語(yǔ)初始化的函數(shù)
如果不寫,默認(rèn)存在一個(gè)無(wú)參構(gòu)造函數(shù)
寫法:
- 沒(méi)有返回值
- 函數(shù)名和類名相同
- 沒(méi)有特殊需求時(shí),一般都是public的
- 構(gòu)造函數(shù)可以被重載
- this代表當(dāng)前調(diào)用該函數(shù)的對(duì)象自己
----
但結(jié)構(gòu)體不允許
----
如果不自己實(shí)現(xiàn)無(wú)參構(gòu)造函數(shù),而實(shí)現(xiàn)了有參構(gòu)造函數(shù),會(huì)失去默認(rèn)的無(wú)參構(gòu)造
--------------------------
通過(guò)this重用構(gòu)造函數(shù)代碼
格式:
- 調(diào)用無(wú)參的重構(gòu)函數(shù):public 類名(參數(shù)): this() { 代碼塊 }; // 注意this前面的冒號(hào)
- 調(diào)用其他有參的重構(gòu)函數(shù):public 類名(參數(shù)): this( 參數(shù) ) { 代碼塊 };
小trick:
=================
一個(gè)代碼示例:
public class Rectangle
{
??private int width;
??private int height;
??// 默認(rèn)構(gòu)造函數(shù)
??public Rectangle() : this(1, 1)
??{
??}
??// 參數(shù)構(gòu)造函數(shù)
??public Rectangle(int width, int height)
??{
????this.width = width;
????this.height = height;
??}
??// 只有一個(gè)參數(shù)的構(gòu)造函數(shù)
??public Rectangle(int side) : this(side, side)
??{
??}
??public void Display()
??{
????Console.WriteLine("Width: {0}, Height: {1}", width, height);
??}
}
在這個(gè)例子中,我們有一個(gè)Rectangle
類,它有三個(gè)構(gòu)造函數(shù):
- 一個(gè)沒(méi)有參數(shù)的構(gòu)造函數(shù),它通過(guò)
: this(1, 1)
調(diào)用另一個(gè)構(gòu)造函數(shù),將寬度和高度都設(shè)置為1。 - 一個(gè)接受兩個(gè)參數(shù)的構(gòu)造函數(shù),它直接設(shè)置寬度和高度。
- 一個(gè)只接受一個(gè)參數(shù)的構(gòu)造函數(shù),它通過(guò)
: this(side, side)
調(diào)用另一個(gè)構(gòu)造函數(shù),將寬度和高度都設(shè)置為同一個(gè)值。
這樣,無(wú)論你使用哪個(gè)構(gòu)造函數(shù)創(chuàng)建Rectangle
對(duì)象,寬度和高度都會(huì)被正確地初始化。例如:
Rectangle rect1 = new Rectangle();
rect1.Display();?// 輸出 "Width: 1, Height: 1"
Rectangle rect2 = new Rectangle(3, 4);
rect2.Display();?// 輸出 "Width: 3, Height: 4"
Rectangle rect3 = new Rectangle(5);
rect3.Display();?// 輸出 "Width: 5, Height: 5"
================
當(dāng)引用類型的堆內(nèi)存被回收時(shí),會(huì)調(diào)用該函數(shù)
對(duì)于需要手動(dòng)管理內(nèi)存的語(yǔ)言,比如C++,需要在析構(gòu)函數(shù)中做一些內(nèi)存回收處理;但c#存在自動(dòng)垃圾回收機(jī)制GC
--------------------------
建議反復(fù)觀看,重點(diǎn)
分代算法
三級(jí)內(nèi)存
主動(dòng)垃圾回收
------------------------------------------------------------------------------
成員屬性
用于保護(hù)成員變量
為成員屬性的獲取和賦值添加邏輯處理
解決public、private、protect的權(quán)限問(wèn)題
屬性可以讓成員變量在外部只能獲取不能修改或者只能修改不能獲取
語(yǔ)法:
================
訪問(wèn)修飾符 屬性類型 屬性名
{
get
{
//可以返回之前添加i一些邏輯規(guī)則
//意味著這個(gè)屬性可以獲取的內(nèi)容
return
}
set
{
//可以再設(shè)置之前添加一些邏輯規(guī)則
//value 關(guān)鍵字 用于表示外部傳入的值
name = value;
}
}
================
--------------------------
get/set前可以加訪問(wèn)修飾符
默認(rèn)不加,會(huì)使用屬性申明時(shí)的訪問(wèn)權(quán)限
加的訪問(wèn)修飾符要低于屬性的訪問(wèn)權(quán)限
不能讓get和set的訪問(wèn)權(quán)限都低于屬性的權(quán)限
--------------------------
一般是只有g(shù)et(只能得),沒(méi)有set(不能改)
--------------------------
作用:外部能得不能改得特征
如果類中有一個(gè)特征時(shí)只希望外部能得不能改的,又沒(méi)什么特殊處理
那么可以直接使用自動(dòng)屬性
================
訪問(wèn)修飾符 屬性類型 屬性名
{
get; // 沒(méi)有大括號(hào)
set;
================
------------------------------------------------------------------------------
索引器
讓對(duì)象可以像數(shù)組一樣通過(guò)索引訪問(wèn)其中元素,使程序看起來(lái)更直觀、更容易編寫
訪問(wèn)修飾符 返回值 this[參數(shù)理性 參數(shù)名,參數(shù)類型 參數(shù)名 ... ... ]
{
內(nèi)部的寫法和規(guī)則和索引器相同
get{}
set{}
}
仍舊不關(guān)注返回值,只有參數(shù)不同的區(qū)分
讓我們可以以中括號(hào)的形式范圍自定義類中的元素,規(guī)則自己頂,訪問(wèn)時(shí)和數(shù)組一樣
比較適用于 在類中有數(shù)組變量時(shí)使用,可以方便的訪問(wèn)和進(jìn)行邏輯處理
注意:
結(jié)構(gòu)體里面也支持索引器
------------------------------------------------------------------------------
靜態(tài)成員
關(guān)鍵字 static
用static修飾的成員變量、方法、屬性
稱為靜態(tài)成員
特點(diǎn):直接用類名點(diǎn)出使用
--------------------------
--------------------------
--------------------------
--------------------------
靜態(tài)成員具有唯一性
--------------------------
成員變量只能將對(duì)象實(shí)例化出來(lái)后,才能點(diǎn)出來(lái)使用,不能無(wú)中生有
--------------------------
因?yàn)榉庆o態(tài)成員和靜態(tài)成員的生命周期有明顯差異
--------------------------
常用唯一變了的申明
方便別人獲取對(duì)象申明
靜態(tài)方法:
常用的唯一的方法申明,比如 相同規(guī)則的數(shù)學(xué)計(jì)算相關(guān)函數(shù)
靜態(tài)內(nèi)存不會(huì)被垃圾回收,一般用在全局共享數(shù)據(jù)上
--------------------------
常量可以理解為特殊的static
常量必須初始化,不能修改
const只能修飾變量的
const一定是寫在訪問(wèn)修飾符后面的
--------------------------
------------------------------------------------------------------------------
靜態(tài)類和靜態(tài)構(gòu)造函數(shù)
用static修飾的類
特點(diǎn):
- 只能包含靜態(tài)成員
- 不能被實(shí)例化
作用:
- 將常用的靜態(tài)成員寫在靜態(tài)類中,方便使用
- 靜態(tài)類不能被實(shí)例化,更能體現(xiàn)工具類的唯一性
- ?第17課:靜態(tài)類和靜態(tài)構(gòu)造函數(shù) P12 - 04:40?
- 靜態(tài)類和普通類都可以有
- 不能使用訪問(wèn)修飾符
- 不能有參數(shù)
- 只會(huì)自動(dòng)調(diào)用一次
------------------------------------------------------------------------------
拓展方法
為現(xiàn)有的非靜態(tài) 變量類型添加 新方法
如果拓展方法和原類中的方法重名,那么被原類中的方法覆蓋
------------------------------------------------------------------------------
運(yùn)算符重載
讓自定義類和結(jié)構(gòu)體能夠使用運(yùn)算符
關(guān)鍵字:operator
特點(diǎn):
- 一定是公共的靜態(tài)方法
- 返回值寫在operator前
- 邏輯處理自定義
------------------------------------------------------------------------------
內(nèi)部類和分布類
把一個(gè)類分成幾部分申明
------------------------------------------------------------------------------
繼承的基本概念
子類只能有一個(gè)父類(c#是單繼承)
子類可以間接繼承父類的父類
父類的private修飾的成員子類都不能使用
所以用protected修飾(外部不允許訪問(wèn),但子類能用)
------------------------------------------------------------------------------
里氏替換原則
任何父類出現(xiàn)的地方,子類都可以替代
重點(diǎn):父類容器能裝子類對(duì)象
作用:方便進(jìn)行對(duì)象的存儲(chǔ)和管理
父類 變量名 = new 子類
注意:不能用子類容器去裝父類對(duì)象
------------------------------------------------------------------------------
繼承中的構(gòu)造函數(shù)
注意:有參構(gòu)造會(huì)頂?shù)裟J(rèn)的無(wú)參構(gòu)造,如果想保留無(wú)參構(gòu)造需要重載出來(lái)
當(dāng)申明一個(gè)子類對(duì)象時(shí),先執(zhí)行父類的構(gòu)造函數(shù),再執(zhí)行子類的構(gòu)造函數(shù)
!
------------------------------------------------------------------------------
萬(wàn)物之父和裝箱拆箱
object時(shí)所有類型的基類,它是一個(gè)類(引用類型)
- 可以用里氏替換原則,用object容器裝所有對(duì)象
- 可以用來(lái)表示不確定類型,作為函數(shù)參數(shù)類型
用object存值類型(裝箱)
把object轉(zhuǎn)為值類型(拆箱)
------------------------------------------------------------------------------
密封類
使用sealed密封關(guān)鍵字修飾的類,讓類無(wú)法再被繼承
不允許最底層子類被繼承
------------------------------------------------------------------------------
多態(tài)-Vob
讓繼承同一父類的子類們,在執(zhí)行相同方法時(shí)有不同的表現(xiàn)(狀態(tài))
主要目的:
同一父類的對(duì)象,執(zhí)行相同的行為(方法)有不同的表現(xiàn)
- 編譯時(shí)多態(tài):函數(shù)重載,開始就寫好的
- 運(yùn)行時(shí)多態(tài):vob、抽象函數(shù)、接口
vob:virtual(虛函數(shù))、override(重寫)、base(父類)
虛函數(shù):用來(lái)給子類重寫
------------------------------------------------------------------------------
抽象類和抽象方法
被抽象關(guān)鍵字abstract修飾的類
- 不能被實(shí)例化的類
- 可以包含抽象方法
- 繼承抽象類必須重寫其抽象方法
- 只能在抽象類中申明
- 沒(méi)有方法體
- 不能是私有的
- 繼承后必須實(shí)現(xiàn),用override重寫
虛方法有方法體,但抽象方法沒(méi)有;
虛方法可以選擇性實(shí)現(xiàn),但抽象方法必須在子類中實(shí)現(xiàn)
抽象方法必須寫在抽象類中,虛方法沒(méi)有限制
抽象類和抽象方法主要用于整體框架設(shè)計(jì)時(shí)
------------------------------------------------------------------------------
接口
接口是行為的抽象規(guī)范
它也是一種自定義類型,關(guān)鍵字:interface
申明規(guī)范:
- 不包含成員變量
- 只包含方法、屬性、索引器、事件
- 成員不能被實(shí)現(xiàn)
- 成員可以不用寫訪問(wèn)修飾符,不能是私有的
- 接口不能繼承類,但可以繼承另一個(gè)接口
使用規(guī)范:
- 類可以繼承多個(gè)接口
- 類繼承接口后,必須事先接口中所有成員
特點(diǎn):
- 它和類的申明類似
- 接口是用來(lái)繼承的
- 接口不能被實(shí)例化,但是可以作為容器存儲(chǔ)對(duì)象
--------------------------
interface 接口名{}
接口是抽象行為的基類
接口命名規(guī)范:帕斯卡前面加個(gè)I
--------------------------
--------------------------
--------------------------
當(dāng)一個(gè)類繼承兩個(gè)接口,但是接口中存在同名方法時(shí)
顯式實(shí)現(xiàn)接口時(shí),不能寫訪問(wèn)修飾符
--------------------------
------------------------------------------------------------------------------
密封方法
用密封關(guān)鍵字sealed修飾的重寫函數(shù)
讓虛方法和抽象方法之后不能再被重寫
特點(diǎn):和override一起出現(xiàn)
------------------------------------------------------------------------------
命名空間
using 空間
或者 空間名.變量
不同namespace中允許有同名類
命名空間中的類默認(rèn)為internal
------------------------------------------------------------------------------
萬(wàn)物之父的方法
------------------------------------------------------------------------------
String
本質(zhì)上是一個(gè)密封類
字符串本質(zhì)就是char數(shù)組,可以通過(guò)數(shù)組的形式來(lái)訪問(wèn)
可以轉(zhuǎn)化為char數(shù)組
有l(wèi)ength屬性,表述string長(zhǎng)度
Format函數(shù)
Remove函數(shù)
str的修改方法都會(huì)返回一個(gè)新的字符串
Replace函數(shù)
Substring方法
重點(diǎn)
Split函數(shù),以某種符號(hào)作為分隔符,切分字符串
------------------------------------------------------------------------------
StringBuilder
用于處理字符串的公共類
修改字符串而不創(chuàng)建新的對(duì)象,需要頻繁修改和拼接的字符串可以使用它,可以提升性能
using System. Text
自動(dòng)擴(kuò)容
獲得容量:Capacity
獲得字符長(zhǎng)度:Length
------------------------------------------------------------------------------
結(jié)構(gòu)體和類的區(qū)別
- 存儲(chǔ)位置不同,一個(gè)在棧上,一個(gè)在堆上
- 結(jié)構(gòu)體具有封裝的特性,但不具備繼承和多態(tài)的特性,因此大大減少了它的使用頻率
- 由于結(jié)構(gòu)體不具備繼承的特性,所以它不能夠使用protected保護(hù)訪問(wèn)修飾符
--------------------------
結(jié)構(gòu)體可以繼承 接口,因?yàn)榻涌谑切袨榈某橄?/p>
--------------------------
對(duì)象是數(shù)據(jù)集合時(shí),優(yōu)先考慮結(jié)構(gòu)體,比如位置、坐標(biāo)等等
從值類型和引用類型賦值時(shí)的區(qū)別上考慮
------------------------------------------------------------------------------
抽象類和接口的區(qū)別
------------------------------------------------------------------------------
總結(jié)