類型與類型的分類(.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關鍵字->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類 當我們使用抽象數據類型聲明時,我們實際上是在建立模板; 當我們使用基本數據類型或模板名聲明時,我們實際上是在創建模板的實例; 所以說,不管是基本數據類型聲明的變量,還是模板的實例, 本質上都是類/結構體/接口的對象實例,即萬物皆對象 |