從C 的ValueType引發的思考

2021-10-05 03:11:47 字數 1665 閱讀 3397

無論上層語言型別多麼複雜,在.net平台上,都逃不過cts的約束,今天,我想說的不是cts,而是上層語言c#型別的一點研究。

請看一下下面的這個**段:

1

public

struct

test

27 }

這是我隨便定義的乙個結構,可以看到這個結構什麼都沒有繼承,但是我卻可以重寫出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

//結構體班級   

2struct

structclass : iclass 

3   910

public

void

showcount()

11   

1415

}   

16//

介面   

17inte***ce

iclass

18   

22class

program

23   

42 }

完畢!

從C 的ValueType引發的思考

無論上層語言型別多麼複雜,在.net平台上,都逃不過cts的約束,今天,我想說的不是cts,而是上層語言c 型別的一點研究。請看一下下面的這個 段 1 public struct test27 這是我隨便定義的乙個結構,可以看到這個結構什麼都沒有繼承,但是我卻可以重寫出equals方法,這個方法來自...

protable支援的valueType型別

protable自帶了表單搜尋功能,預設的formitem是input型別,想要改變搜尋型別,可以通過使用valuetype型別定義,或者自定義formitem 如圖,如果想要這種下拉元件,或者時間元件 在columns中新增屬性valuetype就可以了 protable支援的屬性 文件 再補充兩...

在C 函式的引數使用valuetype

今天要寫乙個函式,要處理不同的資料型別,如int,float等。但是又不想overload多個函式。所以找了一些資料,把valuetype找出來。我自己平時的寫法。public void func ref string a,int i public void func ref string a,fl...