標籤:
C#1語言核心基礎
本部分將重點討論C#1語言中的幾個核心基礎,他們包括:委託、類型系統、值/參考型別
1.委託
委託類似與函數指標,是要在恰當的時間執行的一系列操作,如果代碼想要執行操作,但不知道操作細節,就可以使用委託。
簡單委託的構成
要執行一個委託必須滿足一下4個條件
- 申明委託類型
- 建立一個方法包含要執行的代碼
- 建立一個委託執行個體
- 調用委託執行個體
合并和刪除委託
上面的例子委託執行個體都只是一個操作,但是真實情況要稍微複雜一些,委託執行個體實際有一個巨集指令清單與之關聯,這就是調用列表。
System.Delegate類型的靜態方法Combine和Remove負責建立新的委託執行個體,Combine負責將兩個委託執行個體的調用列表串連到一起,而Remove負責從一個委託執行個體中刪除另一個執行個體的調用列表。
在C#代碼中一般很少顯示調用,Combine一般使用+或者+=操作符;而Remove一般使用-或者-=操作符。
調用委託執行個體時所有的操作都是按順序執行,如果委託的簽名具有非void傳回值,這Inovke的傳回值是最後一個值的傳回值。如果調用列表中任何一個方法拋出異常,都會阻止執行後續的操作。
事件
事件和委託直接差異十分大,事件不是委託類型的欄位。之所以會產生混淆是因為C#提供一種簡寫方式,允許使用欄位風格的事件(C#編譯器提供的文法糖)
event<委託類型> 事件名
{
Add{ //將函數註冊到自己定義的委託執行個體 }
Remove{ //解除函數對自己定義的委託執行個體的註冊 }
}
總結
- 委託封裝了包含特殊傳回型別和一組參數的行為,類似包含單一方法的介面;
- 委託型別宣告中所描述的類型簽名決定哪個方法可以用於建立委託執行個體,同時決定調用的簽名;
- 為了建立委託執行個體,需要一個方法以及調用方法的目標;
- 委託執行個體是不易變的;
- 每個委託執行個體都包含一個調用列表(一個巨集指令清單)
- 委託執行個體可以合并到一起,也可以從一個委託執行個體中刪除另一個;
- 事件不是委託執行個體,只是成對的add/reamove方法
2.類型系統的特徵C#的類型系統
C#1的類型系統是靜態、顯式的和安全的
C#是靜態類型:每一個變數都有一個特定的類型,而且該類型在編譯時間是已知的。只有類型已知的操作才是允許的,這是有編譯器強制生效。
動態類型可能具有多種形式,動態類型的實質是變數中含有值,但那些值並不限定特定的類型,所以編譯器不能執行相同形式的檢查。C#4引入了動態類型,但是大多數C#4應用程式還是靜態類
顯示類型和隱式類型的區別只有在靜態類型的語言中才有意義。
顯示類型每個變數的類型都必須在聲明中顯示指明 string s="hello";
隱式類型則允許編譯器根據變數的用途來推斷變數的類型(var 類型推斷) var s="hello"
型別安全:C#語言,CLR強制類型轉換,不正確時會拋出異常,不允許直接操作記憶體等
類型不安全:C和C++語言,允許直接進行資料轉換,操作記憶體,裝置指標等。功能強大但是容易出錯
總結
- C#1是靜態、顯示的、安全的
- 靜態類型任然不允許一個集合成為強型別的"字串列表"或者"整數列表",除非針對不同的元素使用大量的重複代碼
- 方法覆蓋和介面實現不允許協變性/逆變性
3.實值型別與參考型別
Linq是C#3的核心,Linq是關於查詢的,其目的是使用一致的文法和特性,以一種易閱讀、可組合的方式,使對多資料來源的查詢變得簡單。
實值型別與參考型別
實值型別:類似只有一份兒報紙,為了給朋友一份,需要影印報紙的全部內容並交給他,屆時他擁有一份完整且與原本的沒有關係的報紙。
參考型別:類似正在讀一個網頁,相比於報紙你只需要將URL地址發個朋友,兩人讀取的內容相同,URL就代替引用。
.Net 中大多數都是參考型別,其中常見的參考型別有:class、數組、枚舉、委託、介面;常見實值型別 int double float bool struct等。
誤區
- 結構體是輕量級的類
- 參考型別儲存在堆上,實值型別儲存在棧上
參考型別的執行個體資料是儲存在堆,但是實值型別不一定儲存在棧上,如果一個類中有實值型別,那麼該實值型別也應該在堆上建立
- 對象在C#中預設是通過引用傳遞的
參考型別變數的值是引用,而不是對象本身。不需要按引用來傳遞參數本身,就可以更改參數引用的那個對象內容。參考型別作為方法參數使用時,參數預設是以"值傳遞"方式來傳遞的,但值本身是一個引用。
裝箱和拆箱
裝箱:將實值型別轉換為參考型別
拆箱:將參考型別轉換為實值型別
總結
- 對於參考型別的運算式,它的值是一個引用,而非對象,引用類似URL,允許你訪問真實資訊的一小片資料
- 對於實值型別的運算式,他的值是實際資料
- 有時實值型別比參考型別更有效,有時恰好相反
- 參考型別的對象總是在堆上,實值型別的值既可能在棧上,也可能在堆上
4.基於C#1基礎之上的新特性
與委託有關特性
C#2中與委託有關的新特性:
泛型(泛型委派類型)
建立委託執行個體時使用的運算式
匿名方法
委託協變性/逆變性
C#3中與委託有關的新特性:
Lambda運算式
與類型系統有關特性
C#2中與系統類別型有關的特性
泛型
受限的委託協變性/逆變性
C#3中與系統類別型有關的特性
匿名型別
隱式類型
擴充方法
C#4中與系統類別型有關的特性
受限的泛型協變/逆變
動態類型
與實值型別有關特性
C#2中與實值型別有關的特性
泛型
可空類型(可以為null的類型)
2.C#1語言核心基礎