類型、存儲和變量
C#程序是一組類型聲明
C程序是一組函數和數據類型
C++程序是一組函數和類
C#程序是一組類型聲明
- C#程序或DLL源碼是一組一種或多種類型聲明
- 對於可執行程序,類型聲明中必須有一個包含Main方法的類
- 命名空間是一種把相關類型聲明分組並命名的方法
類型是一種模板
可以把類型想象成一個用來創建數據結構的模板。模板本身不是數據結構,但它說明了由該模板構造的對象的特征。
類型由下面的元素定義:
- 名稱
- 用於保存數據成員的數據結構
- 一些行為及約束條件
例:short類型和int類型
實例化類型
從類型模板創建實際對象,稱為實例化類型
- 實例化類型創建的對象稱為類型的實例(對象)
- C#程序中,每個數據項都是某類型的實例。類型可以是語言自帶的、BCL或其它庫提供的,或是程序員定義的
數據成員和函數成員
- 數據成員:保存了與這個類的對象或作為一個整體的類相關的數據
- 函數成員:執行代碼。函數成員定義類型的行為
預定義類類型
C#提供16種預定義類型,包括13種簡單類型和3種非簡單類型
- 簡單類型
- 11種數值類型
- 不同長度的有符號和無符號整數類型
- 浮點數的float和double
- 高精度小數類型decimal(常用於貨幣計算)
- 一種Unicode字符類型 char
- 一種bool類型,布爾值只能為true或false
- 11種數值類型
- 非簡單類型
- string Unicode字符數組
- object 所有其他類型的基類
- dynamic 使用動態語言編寫程序集時使用
所有的預定義類型都直接映射到底層的.NET類型。C#類型名稱就是.NET類型的別名,
所以可以使用.NET類型名稱替代C#類型名,但不鼓勵這樣做。
用戶定義類型
用戶可以自定義6種類型
- class 類類型
- struct 結構類型
- array 數組類型
- enum 枚舉類型
- delegate 委托類型
- interface 接口類型
類型通過類型聲明創建,類型聲明包含以下信息
- 要創建類型的種類
- 新類型名稱
- 類型中每個成員的聲明(array和delegate除外,它們不含命名成員)
棧和堆
程序運行時,他的數據必須存儲在內存中。一個數據需要多大內存,存儲在什么地方,以及如何存儲都依賴於該數據項的類型。
運行中程序使用兩個內存區域來存儲數據:棧和堆
棧
棧是一個LIFO(Last-In First-Out,后進先出)的內存數組。
棧存儲以下幾種類型數據
- 某些類型變量的值
- 程序當前的執行環境
- 傳遞給方法的參數
棧的特征
- 數據只能從棧的頂端插入或刪除
- 把數據放到棧頂稱為入棧(push)
- 從棧頂刪除數據稱為出棧(pop)
堆
在堆里可以分配大塊內存來存儲某類型的數據對象。
與棧不同,堆里的內存能以任意順序存入或移除。
CLR的GC(Garbage Collector,垃圾收集器)自動刪除堆上不再訪問的數據。
值類型和引用類型
- 值類型只需要一段單獨的內存。
- 引用類型需要兩段內存
- 第一段存儲實際數據,它總是位於堆中
- 第二段是一個引用,指向數據在堆中的存放位置
存儲引用類型對象的成員
如果數據是另一個對象的成員,那么它的存儲會有些不同
- 引用類型對象的數據部分始終存放在堆里
- 值類型對象,或引用類型數據的引用部分可以存在堆里,也可以存在棧里,這取決於實際情況
對於一個引用類型,其實例的數據部分始終存放在堆里
C#類型的分類
變量
變量允許程序存取數據
- 變量是一個名稱,表示程序執行時存儲在內存中的數據
- C#提供4種變量
靜態類型和dynamic關鍵字
每個變量都有變量類型,這樣編譯器就可以確定運行時需要的內存總量以及哪些部分應該存在棧上,哪些存在堆上。
變量類型在編譯時就確定且不能在運行時修改,這叫靜態類型。
dynamic代表一個特定的、實際的C#類型,它知道如何在運行時解析自身。
可空類型
某些情況下,特別是使用數據庫時,你希望表示變量目前未保存有效的值(數據庫中的null)。
對於引用類型,你可以直接把變量設置為null,但值類型不行。
可空類型允許創建可以標記為有效或無效的值類型
int? i =10; double? d1 =3.14; bool? flag =null; char? letter ='a'; int?[] arr =newint?[10];