無論上層語言類型多麼複雜,在.NET平臺上,都逃不過CTS的約束,今天,我想說的不是CTS,而是上層語言C#類型的一點研究。 請看一下下麵的這個代碼段: 1 public struct test 2 { 3 public override bool Equals(object obj) 4 { 5 ...
無論上層語言類型多麼複雜,在.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 }
完畢!