1.命名空間聲明:命名空間是一種特殊的分類機制,它將與一個特定功能有關的全部類型都分組到一塊兒。通常將外層命名空間指定爲公司名,向內依次是產品名,最後是功能區域,好比Microsoft.Win32.Networking。命名空間中中能夠包含句點,這樣使得命名空間「顯得」井井有條,可是,這隻對加強可讀性有利,由於編譯器認爲全部命名空間都在同一個級刷上,數組
例如 System.Collections.Generics 彷佛被包含在 System.Collections 命名空間內部,可是對於編譯器來講.它們是兩個完生抽立的,徹底不一樣的命名空間。性能
2.using導入的區別:在文件的頂部放置 using 指令和在命名空間聲明的內部的頂部放置 using 指令的區別在於,後者的 using 指令只在你聲明的那個命名空間內有效,假如在 Awl.Mlchaelis.EssentialCSharp 命名空間的外部又聲明瞭一個新的命名空間,新的命名空間不會受到 using.System指令的影響。不過,不多會這樣寫代碼,尤爲是根據約定,每一個文件只應該有一個類型聲明。spa
3.using的別名:利用 using 指令爲命名空間或類型取一個別名,別名(alias)是在 using 指令所在的那個範圍內可使用的一個替代名稱。之因此要使用別名,兩個最多見的緣由是:消除同名的兩個類型的歧義和縮寫一個長名稱。命令行
4.程序入口方法:Main()方法支持int返回值,而不是僅僅支持vold返回. 退回值對於Main()聲明來講是可選的. 可是,假如使用了它. 程序就能夠將一個狀態碼返回給調用者(調用者能夠是一個腳本,也能夠是一個批處理文件)。根據約定,一個非零的返回值表明一個錯誤。雖然全部命令行參數均可以經過一個字符串數組傳遞給Main(),但咱們有時候可能須要從一個不一樣於Main()的方法中訪問那些參數,在這種狀況下,可使用 System.Environment.GetCommandLineArgs()方法,該方法採起和Main(string[] args)將參數傳遞給Main()同樣的方式來返回命令行參數。設計
5.C#4.0新增:繼承
(1)可選參數:可選參數必定放在全部必須的參數(無默認值的參數)後面。另外,默認值必須是一個常量,或者說必須是編譯時能肯定的一個值,這-點極大限制了「可選參數」的應用。接口
如:DirectoryCountLines(string directory,string extension="*.cs")開發
(2)命名參數:利用命名參盤,調用者可顯式指定參數名.併爲該參數賦一個值,而不是像之前那樣只能依據參數順序來決定哪一個值賦給哪一個參數,字符串
如:DisplayGreeting(firstName:"Lucy",lastName:"Jack");編譯器
public void DisplayGreeting(string firstName,string middleName=default(string),string lastName=default(string))
{
....省略
}
若是一個方站有大量的參數,並且其中許多都是可選的(訪問Microsoft COM庫時,這是很常見的-種狀況),那麼命名參數語法確定能帶來很多便利。但要注意的是,這個便利的代價是犧牲方法接口的靈活性,過去{至少就 C#來講),參數名能夠自由更改,不會形成調用代碼沒法編譯的狀況. 但在添加了命名參數後,參數名就成爲方法接口的一部分,更更名稱會致使使用命名參數的代碼沒法編譯。
6.假如方法重載、可選參數和命名參數這幾種技術一塊兒使用,咱們難以一眼看出最終調用的究竟是哪一個方法,只有在全部參數(可選參數除外)都剛好有一個對應的實參(不論是根據名稱仍是位置),並且該實參具備兼容類型的狀況下,才說一個調用適用於(兼容於)一個方法。雖然這限制了可調用的方法數量,但還不足以惟一性地標識方法,爲了進一步區分方法,編譯器只使用調用者顯式標識的參數,忽略調用者沒有指定的全部可選參數。因此,假如因爲一個方法有一個可選參數,形成兩個方法都適用,編譯器最終選擇的將是無可選參數的方法。
編譯器從一系列「適用」的方法中選擇最終調用的方法時,依據的是哪一個方法最具體,只能有一個方法徹底匹配調用者傳遞的參數,因此,該方法老是具備最高優先級。
如:調用者傳遞的是一個 int,那麼接受 double 的方法將優先於接受 object 的方法,這是因爲 double 比 object 更具體,若是有多個適用的方法,但沒法從中挑選出最具惟一性的,編譯器就會報錯,指明調用存在歧義。在寫理序時,最好是使用顯式轉型,方便別人理解你想調用哪一個目標方法。
7.try-catch-finally的使用:catch由具體到通常,假如在捕捉Exception 的catch 塊以後添加了一個具體的 catch 塊,編譯器就會報告一條警告消息,指出具體的catch塊永遠都不會執行。沒有指定數據類型的 catch 塊稱爲泛化catch塊(generic catch block),它等價於獲取 object數據類型的catch塊。
例如 catch(object exception){ . . . ),因爲全部類最終都是從 object派生 , 因此沒有數據類型的 catch 塊必組出如今最後。泛化的 catch 塊不多使用,由於沒有辦法捕捉有關異常的任何信息。避免使用異常處理來處理預料之中的狀況,開發者應當儘可能避免爲預料之中的狀況或者正常的控制流引起異常,異常是專門爲了跟蹤例外的、事先沒有預料到的、並且可能形成嚴重後果的狀況而設計的,爲預料之中的狀況使用異常,會形成你的代碼難以閱讀、理解和維護。
C#在拋出異常時會產生些許性能損失,相較幹大多數操做都是納秒級的速度,它可能形成毫秒級的延遲,人們日常注意不到這個延遲,除非異常沒有獲得處理。
8.catch塊中使用throw:能夠在一個catch塊中從新引起異常(如在catch(ArgumentNullException ex)的實現中,能夠包含對throw ex的調用),而後像這樣從新引起異常,會將棧追蹤重置爲從新引起的位置,而不是重用原始引起位置。在一個catch塊的內部,假如你從新引起一個不一樣的異常,那麼不只會重置引起點,還會隱藏原始異常,爲了保留原始異常,須要設置新異常的InnerException屬性(該屬性一般能夠經過構造器來賦值)。
9.自定義異常:自定義異常惟一的硬性要求就是它必須從System.Exception或者其某個子類派生,除此以外,在使用自定義異常的時候,還應遵守如下最佳實踐。
(1)全部異常都應該使用「Exception」後綴,彰顯其用途。
(2)一般,全部異常都應該包含如下3個構造器:無參數構造器、獲取一個string參數的構造器、以及同時獲取一個字符串和一個內部異常做爲參數的構造器。
(3)避免使用深的繼承層次結構(通常應該小於5級)。
10.從NET Framework 4 開始,枚舉類型也添加了一個TryParse方法。
-------------------------------------------以上內容根據《C#本質論 第三版》進行整理