大學學了C#,工作也是使用C#,雖然在日常的開發中沒什麼大的問題,但個人覺得在C#的理解還不是很清晰,所以決定花一定的時間來理一理學過的知識,順便革新下腦袋裡的知識,因為坑爹的學校在教.net的時候,是.net 2.0版本的,有點老古董了。哎,個人覺得是老師只會拖控件,而且對於新的.net版本他們應該很難去接受,所以挑選教材的時候,也不願意去挑選自己不熟悉的新的.net版本。好了,也不吐槽學校和老師了,還是自己努力吧,因為老師畢竟教你了他們知道的。
1,類型
C#是一種強類型的語言。每個變量和常量都有一個類型,每個計算為值的表達式也是如此。 每個方法簽名為每個輸入參數和返回值指定一個類型。 .NET Framework 類庫定義了一組內置數值類型以及表示各種邏輯構造的更復雜的類型,例如文件系統、網絡連接、對象的集合和數組及日期。 典型 C# 程序使用類庫中的類型,還使用為特定於該程序問題域的概念建模的用戶定義類型。
思考一下,類型是干什麼用的。其實不難發現,我們總是把我們需要的東西存儲在用類型定義的變量上,如 int i=1,我們就把1存儲在i變量所在的存儲空間裡,所以類型就是用來存儲信息的。
類型可以存儲的信息包括
該類型的變量所需的存儲空間。
該類型可以表示的最大值和最小值。
該類型包含的成員(方法、字段、事件等)。
該類型所繼承的基類型。
將在運行時為其分配變量內存的位置。
允許的運算種類行
當然我們使用類型的時候,是通過編譯器,編譯器為什麼能夠執行,是因為執行的代碼是安全的,那麼編譯器是怎麼確保執行的代碼是類型安全的?例如,我們不可能把一個boolean類型的數據賦值給一個int類型的數據。這就可以想到:類型是存儲信息的,所以編譯器是通過類型存儲的信息確保代碼中執行的所有運算都是類型安全的。
其實編譯器將類型信息作為元數據嵌入到可執行文件中。 公共語言運行時 (CLR) 會在運行時使用該元數據,以進一步確保它在分配和回收內存時類型安全。
(1),在變量中聲明指定的類型
在程序中聲明變量或者常量的時候,必須指定類型或者使用關鍵字var讓編譯器可以識別到其類型。如下使用了一些類型和自定義的類型
Codefloat temperature;//float類型 string name;//string類型 MyClass myClass;//自定義類型 char firstLetter = 'C';//char類型 var limit = 3;//var 定義的object類型,可千萬別單純的認為這個是int類型 int[] source = { 0, 1, 2, 3, 4, 5 };//數組,引用類型在程序中,類型可以在方法參數和指定返回值中使用,看下面代碼傳入參數定義為了int類型,返回值是string類型
Codepublic string returnValue(int id){ return id+""; }聲明了一個變量後,不能使用新類型重新對它進行聲明,也不能向它賦與它的聲明類型不兼容的值。例如,不能聲明 int,然後向它賦予布爾值 true。 但是,值可以轉換為其他類型,例如將值賦給新變量或者作為方法參數傳遞時。 編譯器會自動執行不會導致數據丟失的類型轉換。 可能導致數據丟失的轉換需要源代碼內有強制轉換。
2,內置類型
C#提供了一組標准的內置數值類型,用來表示整數、浮點值、布爾表達式、文本字符、十進制數值和其他類型。還有內置的string和object類型。我們可以在c#程序中可以很方便的使用這些類型
3,自定義類型
我們可以使用struck、class、interface和enum來創建我們自己自定義的類型。NET Framework 類庫本身是 Microsoft 提供的自定義類型的集合,您可以在自己的應用程序中使用它們。 默認情況下,類庫中最常用的類型在所有 C# 程序中均可用。 而對於其他類型,則僅當您顯式添加定義這些類型的程序集的項目引用後它們才可用。 編譯器擁有對該程序集的引用後,才可以在源代碼中聲明在該程序集中聲明的類型的變量(和常量)
4,通用類型
(1)值類型
值類型派生自System.Object和System.ValueType.派生自 System.ValueType 的類型在 CLR 中有特殊行為值類型變量直接包含它們的值,這意味著內存在聲明變量的任意上下文中都是以內聯方式分配的。 值類型變量沒有單獨的堆分配或垃圾回收開銷。
值類型分為兩個類別:struct和enum。
內置值類型具有可以訪問的屬性和方法。如 byte b=Byte.MaxValue。我們也可以向值類型賦值,如int i=1;
我們也可以使用struct來創建自己的自定義類型。如
Codepublic struct Person{ int x; int y; public int say(int parms1,int parms2){ return parms1+parms2; } }
我們可以使用enum來定義一組常量,如
Codepublic enum number{1,2,3}
枚舉類型主要是用來限制變量的可能性,如我們上面定義了枚舉number,包含了123,三個int型,在使用number時,只能使用這3個數,不可能出現其他的數。
(2)引用類型
定義為類、委托、數組或接口的類型是引用類型.在運行時,當您聲明引用類型的變量時,該變量會一直包含值 null,直至您使用 new 運算符顯式創建對象的實例,或者為該變量分配已經在其他位置使用 new 創建的對象, 如
CodePeroson p1=new Person(); Person p2=p1;接口必須與實現它的類對象一起初始化
創建對象時,將在托管堆上分配內存,變量只保存對對象位置的引用。對於托管堆上的類型,在 CLR 的自動內存管理功能(稱為“垃圾回收”)對它們進行分配和回收時都需要系統開銷。 但是,也對垃圾回收進行了高度優化,在大多數情況下它不會引起性能問題
所有數組都是引用類型,即使其元素是值類型也不例外.數組是從 System.Array 類隱式派生的,但可以通過 C# 提供的簡化語法來聲明和使用它們,如下面的示例所示:
Codeint[] num={1,2,3,4,5}; int len=num.Length;
引用類型完全支持繼承.創建類時,可以從沒有定義為 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,匿名類型
某些情況下為相關值的簡單集合創建命名類型是不方便的,因為這些相關值不准備在方法邊界外存儲或傳遞。可以創建匿名類型來實現此目的。
9,可以為null的類型
普通的值類型不能有 null 值。但是,可以通過在類型後面附加 ? 來創建可以為 null 值的類型。 例如,int? 是一個也可以具有 null值的 int 類型。 在 CTS 中,可以為 null 的類型是泛型結構類型 System.Nullable<T> 的實例。 在向其數值可能為 null 的數據庫傳入數據和從中傳出數據時,可以為 null 的類型尤其有用。
以上內容參考msdn的C#編程指南,僅僅為了學習,如有不妥,請指出。謝謝