從C#的ValueType引發的思考


無論上層語言類型多么復雜,在.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 }  

完畢!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM