無論上層語言類型多么復雜,在.NET平台上,都逃不過CTS的約束,今天,我想說的不是CTS,而是上層語言C#類型的一點研究。
請看一下下面的這個代碼段:
1 public struct test 2 { 3 public override bool Equals(object obj) 4 { 5 return base.Equals(obj); 6 } 7 }
這是我隨便定義的一個結構,可以看到這個結構什么都沒有繼承,但是我卻可以重寫出Equals方法,這個方法來自哪里,這個結構的父親又是誰呢?
一、結構為什么不能繼承類
開門見山,ValueType!!
是的,所有的結構都默認繼承了該類,對的,是一個類,也就是說所有的結構都是有繼承的,繼承了ValueType,也是因為這樣,所以結構不能再繼承類了,只能繼承接口,因為C#是單繼承的。
二、為什么每個結構都有ToString等方法
ValueType!還是ValueType!
因為結構默認繼承了ValueType,也就是繼承了Object,所以其實結構可以看成一個類,只是這個類很特別,比靜態類,最終類還特別,區別包括:編譯時會對他進行特殊處理,內存分配規則,不能被繼承,實例化過程等等。所以結構在寫法上和類很多地方很像,比如也可以擁有方法,等等,其實結構就是一個被閹割的非常厲害的類。
三、enum的類型
enum也是值類型,為什么這么說呢?
1、typeof(枚舉).BaseType可以看到enum的付類是System.Enum類,而System.Enum繼承ValueType。
2、enum的內存分配方式和值類型一樣都是分配在棧上。
3、enum是一種特殊的值類型,不能有結構,函數等等。
但是System.Enum是類(引用類型),所以並不是所有繼承ValueType的都是值類型(這個類我們自己也可以寫個類去繼承)
四、哪些類型是值類型?值類型有什么特點?
1、基礎類型:decimal、bool、char、byte、sbyte、short、int、long、ushort、uint、ulong、single、double
2、用戶自定義值類型(以關鍵字struct聲明的)
3、enum特殊值類型
值類型特點:值類型的數據特點很多,大多是和類做區分的,具體大家可以查一下資料哈。
五、值類型可以繼承接口,用接口訪問值類型的時候,是值還是引用?
大家猜一猜是值還是引用呢?好了先公布答案吧,答案是引用!
IComparable i = 0; 當用接口指向值得時候,這個值會有一個裝箱得過程,也就是值類型會裝箱成一個引用類型。下面,我們用以下代碼段來證明一下。
1 //結構體班級
2 struct StructClass : IClass 3 { 4 public int Count;//人數
5 public void AddStudent() 6 { 7 Count++; 8 } 9 10 public void ShowCount() 11 { 12 Console.WriteLine(Count); 13 } 14 15 } 16 //接口
17 interface IClass 18 { 19 void AddStudent();//添加學生
20 void ShowCount();//顯示學生人數
21 } 22 class Program 23 { 24 static void Main(string[] args) 25 { 26 StructClass s1 = new StructClass(); 27 StructClass s2 = s1; 28 s1.AddStudent(); 29 s1.ShowCount(); //輸出1
30 s2.ShowCount(); //輸出0 31 //說明s2和s1不指向同一個對象,s2=s1是創建了一個s1的副本 32 //這是值類型很顯著的標志
33 34 IClass ic1 = new StructClass(); 35 IClass ic2 = ic1; 36 ic1.AddStudent(); 37 ic1.ShowCount();//輸出1
38 ic2.ShowCount();//輸出1 39 //說明s2和s1指向同一個對象,s2=s1是將s1的引用賦給s2 40 //這是引用類型很顯著的標志
41 } 42 }
完畢!