類型與類型的分類(.NET FrameWork底層結構)
前言:int a=5;// a是一個變量,它的本質是一個System.Int32結構體的對象實例
|
類型究竟是什麼:類型是任何編程語言最底層的東西(因此每當提到XX是類型,不要想它的繼承關係,由於它是表明底層的數據或數據結構)
類型是一組關鍵字,它同於聲明一個標識符的基本數據類型或者抽象數據結構類型;
類型決定了一塊內存到底要存什麼樣的數據/數據塊或要刻畫什麼樣的數據結構模板;
在.NET中,類型關鍵字和其餘關鍵字同樣,用藍色字體
1)基本數據類型:基本數據類型類型聲名的標識符稱爲變量,變量用來直接用於存儲數據的值
基本數據類型的聲明能夠在數據結構類型中和方法體中,不容許定義在命名空間裏
基本數據類型的定義就是一個定義變量的過程;
值類型:值類型的基本數據類型聲明的變量直接存儲值;(
int,float,char,bool)
引用類型:引用類型的基本數據類型聲明的變量用於存儲對值(對象)的引用;
(
string、數組、object
)
2)抽象數據結構類型:抽象數據結構的類型能夠定義在命名空間中和數據結構類型中,不容許定義在方法體中
類是一個數據結構,咱們把class,interface,delegate,struct,enum具備平行關係的(能夠用於聲明變量的)類型聲明關鍵字統稱抽象數據結構類型 |
抽象數據結構類型聲明的又是一個自定義的數據類型(模型、模板),也就是說,一個抽象數據結構類型的標識符被定義完成以後,仍然做爲一個類型的關鍵字來聲明變量(這個變量就是自定義數據類型(模板)的對象,或者稱爲模板的實例化(類的實例化,委託的實例化,結構體的實例化、枚舉的實例化....));
抽象數據類型的定義是一個創建模板的過程(或者說是創建一個自定義類型的過程);
模板被實例化,是一個模板被印刷的過程;被實例化後的模板就能夠和其餘 變量同樣使用(變量就是一個對象);
.NET被聲明的
抽象數據結構類型標識符用:
綠色字體(一個定義好的接口、枚舉使用綠色)和 淺藍色字體(一個定義好的類、結構體使用淺藍色)
值類型:值類型的抽象數據結構類型所聲明的類型的對象,他的值將用於直接存儲對象實例的值;(Struct,Enum);
引用類型:引用類的抽象數據結構類型所聲明的類型的對象,它的值是一個對對象實例的引用(class,Interface,delegate)
基本數據類型和抽象數據類型都分爲值類型和引用類型, 它們的值類型直接存儲(變量的值)/(對象的實例); 它們的引用類型存儲(對值的引用)/(對對象實例的引用); |
規範化語言(更利於我邏輯清晰的理解知識) 1.當咱們使用類型關鍵字聲明一個模板或一個變量時,稱這個模板/變量就是這個類型關鍵字,例如: class A{},稱A是一個類/ A是類類型的; delegate void B{},B是一個委託/ B是委託類型的 GameObject Go;Go是一個GameObject/ Go是GameObeject類型的 string s;s是一個字符串/ s是字符串類型的 |
.NET中類型的隱式繼承關係:(萬物皆對象)
隱式繼承在聲明一個基本數據類型的變量或一個抽象數據類型的模板以後自動完成;
當使用基本數據類型關鍵字聲明一個變量時,這個變量的值就是.Net中一個封裝好的類(結構體)的實例
當使用抽象數據結構類型關鍵字聲明一個模板時,.NET會讓這個變模板會自動的按照後面的路徑隱式繼承在.NET中已經封裝好的類/接口
tips:一些類型的隱式繼承關係按F12是看不到的 ,必須在.NET文檔中才能查看
1)值類型的隱式繼承關係:(inherited by ValueType->Object)
使用值值類型聲明的關鍵字是一個變量/對象,變量用於直接存儲值;c#中,全部的值類型都隱式繼承自ValueType)
下面表述了值類型的繼承層次
基本數據類型:
int關鍵字->Int16(struct)/
Int32(Struct)/Int64(Struct)->System.Valuetype->System.Object
上述含義是指:當使用int關鍵字聲明一個整型變量時,這個變量自己是.NET中封裝好的Int32結構體的一個對象; |
char關鍵字->System.Char->System.ValueType->System.Object //即一個char類型的變量其實是一個System.Char結構體的對象
bool關鍵字->System.Boolean(Struct)->System.ValueType->System.Objecct
float關鍵字->System.Single(Struct)->System.ValueType->System.Objecct
......
綜上:值類型的基本數據類型聲明的變量本質是一個.NET預約義的結構體的對象,而這個結構體直接或者間接繼承自System.ValueType
抽象數據結構類型
enum關鍵字->System.Enum(abstrct class)->System.ValueType->System.Object(Class)
上述含義是指,當使用Enum關鍵字聲明一個枚舉時,.NET會讓這個枚舉會自動的按照後面的路徑隱式繼承在.NET中已經封裝好的類/接口,下同 |
Struct關鍵字->System.ValueType->System.Object
綜上:值類型的數據結構類型所聲明的模板直接或者間接繼承自System.ValueType
2)引用類型的隱式繼承關係:
基本數據類型:
string關鍵字->System.String(class)->System.Object
[]數組->System.Array(class)->System.Object
抽象數據結構類型:
class關鍵字(未顯示聲明繼承關係時)->System.Object
上述含義是指:當使用class關鍵字聲明一個類時,這個類會自動繼承自.NET中已經封裝好的基類Object |
|
delegate關鍵字->System.Delegate(class)->System.Object
Interface關鍵字(
未顯示聲明繼承關係時)->不是System.Object的擴展類型,使用它聲明的接口不不繼承任何已封裝好的類(
特殊)
理解:使用c#等面嚮對象語言,萬物皆對象不僅是口號,更體如今了.NET FrameWork底層的類層次結構中; 1.全部用基本數據類型所聲明的變量的本質:是其對應的已經封裝好的類/結構體的對象; 例如:string聲明的字符串變量本質是System.String類的對象; 操做:string s="";//使用F12會搜索到System.String類,說明s是System.String類的對象 2.全部的抽象數據結構類型所聲明的模板,本質上都繼承了已經封裝好的類(interface除外,它沒有繼承自任何已封裝好的類/結構體); 例如:delegate聲明的委託,本質上是繼承自System.Delegate類
當咱們使用抽象數據類型聲明時,咱們其實是在創建模板; 當咱們使用基本數據類型或模板名聲明時,咱們其實是在建立模板的實例;
因此說,無論是基本數據類型聲明的變量,仍是模板的實例,本質上都是類/結構體/接口的對象實例,即萬物皆對象 |