無論上層語言型別多么復雜,在.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 }
完畢!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/67192.html
標籤:C#
下一篇:C#的基礎知識
