大學學了C#,工作也是使用C#,雖然在日常的開發中沒什么大的問題,但個人覺得在C#的理解還不是很清晰,所以決定花一定的時間來理一理學過的知識,順便革新下腦袋里的知識,因為坑爹的學校在教.net的時候,是.net 2.0版本的,有點老古董了。哎,個人覺得是老師只會拖控件,而且對于新的.net版本他們應該很難去接受,所以挑選教材的時候,也不愿意去挑選自己不熟悉的新的.net版本。好了,也不吐槽學校和老師了,還是自己努力吧,因為老師畢竟教你了他們知道的。
1,類型
C#是一種強類型的語言。每個變量和常量都有一個類型,每個計算為值的表達式也是如此。 每個方法簽名為每個輸入參數和返回值指定一個類型。 .NET Framework 類庫定義了一組內置數值類型以及表示各種邏輯構造的更復雜的類型,例如文件系統、網絡連接、對象的集合和數組及日期。 典型 C# 程序使用類庫中的類型,還使用為特定于該程序問題域的概念建模的用戶定義類型。
思考一下,類型是干什么用的。其實不難發現,我們總是把我們需要的東西存儲在用類型定義的變量上,如 int i=1,我們就把1存儲在i變量所在的存儲空間里,所以類型就是用來存儲信息的。
類型可以存儲的信息包括
該類型的變量所需的存儲空間。
該類型可以表示的最大值和最小值。
該類型包含的成員(方法、字段、事件等)。
該類型所繼承的基類型。
將在運行時為其分配變量內存的位置。
允許的運算種類行
當然我們使用類型的時候,是通過編譯器,編譯器為什么能夠執行,是因為執行的代碼是安全的,那么編譯器是怎么確保執行的代碼是類型安全的?例如,我們不可能把一個boolean類型的數據賦值給一個int類型的數據。這就可以想到:類型是存儲信息的,所以編譯器是通過類型存儲的信息確保代碼中執行的所有運算都是類型安全的。
其實編譯器將類型信息作為元數據嵌入到可執行文件中。 公共語言運行時 (CLR) 會在運行時使用該元數據,以進一步確保它在分配和回收內存時類型安全。
(1),在變量中聲明指定的類型
在程序中聲明變量或者常量的時候,必須指定類型或者使用關鍵字var讓編譯器可以識別到其類型。如下使用了一些類型和自定義的類型
Code
在程序中,類型可以在方法參數和指定返回值中使用,看下面代碼傳入參數定義為了int類型,返回值是string類型
Code
聲明了一個變量后,不能使用新類型重新對它進行聲明,也不能向它賦與它的聲明類型不兼容的值。例如,不能聲明 int,然后向它賦予布爾值 true。 但是,值可以轉換為其他類型,例如將值賦給新變量或者作為方法參數傳遞時。 編譯器會自動執行不會導致數據丟失的類型轉換。 可能導致數據丟失的轉換需要源代碼內有強制轉換。
2,內置類型
Code
Code
枚舉類型主要是用來限制變量的可能性,如我們上面定義了枚舉number,包含了123,三個int型,在使用number時,只能使用這3個數,不可能出現其他的數。
(2)引用類型
定義為類、委托、數組或接口的類型是引用類型.在運行時,當您聲明引用類型的變量時,該變量會一直包含值 null,直至您使用 new 運算符顯式創建對象的實例,或者為該變量分配已經在其他位置使用 new 創建的對象, 如
Code
接口必須與實現它的類對象一起初始化
創建對象時,將在托管堆上分配內存,變量只保存對對象位置的引用。對于托管堆上的類型,在 CLR 的自動內存管理功能(稱為“垃圾回收”)對它們進行分配和回收時都需要系統開銷。 但是,也對垃圾回收進行了高度優化,在大多數情況下它不會引起性能問題
所有數組都是引用類型,即使其元素是值類型也不例外.數組是從 System.Array 類隱式派生的,但可以通過 C# 提供的簡化語法來聲明和使用它們,如下面的示例所示:
Code
引用類型完全支持繼承.創建類時,可以從沒有定義為 sealed 的任何其他接口或類繼承,而其他類則可以從您創建的類繼承并重寫虛方法
5,文本值類型
在 C# 中,文本值從編譯器接收類型。您可以通過在數字末尾追加一個字母來指定應如何類型化該數字文本。 例如,若要指定應按浮點數來處理值 4.56,則在該數字后追加一個“f”或“F”:4.56f。 如果沒有追加字母,則編譯器將為該文本推斷一個類型。
6,泛型類型
一個類型可以通過一個或多個類型參數聲明,而這些類型參數作為客戶端代碼在創建該類型的實例時提供的實際類型(具體類型)的占位符。這種類型稱為“泛型類型”。 例如,.NET Framework 類型 System.Collections.Generic.List<T> 有一個類型參數,按照約定該類型參數的名稱為 T。 在創建該類型的實例時,會指定列表將包含的對象的類型。如
List<int> list=new List<int>();
7,隱式類型
使用關鍵字 var隱式類型化一個局部變量(非類成員),該變量在編譯時仍然會接收一個類型,但該類型是由編譯器提供的
8,匿名類型
某些情況下為相關值的簡單集合創建命名類型是不方便的,因為這些相關值不準備在方法邊界外存儲或傳遞??梢詣摻涿愋蛠韺崿F此目的。
9,可以為null的類型
普通的值類型不能有 null 值。但是,可以通過在類型后面附加 ? 來創建可以為 null 值的類型。 例如,int? 是一個也可以具有 null值的 int 類型。 在 CTS 中,可以為 null 的類型是泛型結構類型 System.Nullable<T> 的實例。 在向其數值可能為 null 的數據庫傳入數據和從中傳出數據時,可以為 null 的類型尤其有用。
以上內容參考msdn的C#編程指南,僅僅為了學習,如有不妥,請指出。謝謝
新聞熱點
疑難解答