標籤:浮點數 小數 儲存 特定 pac 高精度 記憶體 它的 儲存位置
一、類型
1、C#程式是一組型別宣告。
2、通過執行個體化類型而建立的對象被稱為類型的對象或類型的執行個體。
3、C#提供16種預定義類型,包括13種簡單類型和3種非簡單類型。
① 13種簡單類型中包括11種數實值型別(包括整數類型和浮點類型)和2種非數實值型別。
表一 11種數實值型別
類型名稱 |
注釋 |
整數類型 |
8種 |
sbyte |
8位有符號整數 |
byte |
8位不帶正負號的整數 |
short |
16位有符號整數 |
ushort |
16位不帶正負號的整數 |
int |
32位有符號整數 |
uint |
32位不帶正負號的整數 |
long |
64位有符號整數 |
ulong |
64位不帶正負號的整數 |
| |
|
浮點類型 |
3種 |
float |
單精確度浮點數 |
double |
雙精確度浮點數 |
decimal |
高精度小數類型,有效數字精度位28位。 |
表二 2種非數實值型別
類型名稱 |
注釋 |
char |
Unicode字元類型 |
bool |
布爾類型 |
② 3種非簡單類型
類型名稱 |
注釋 |
object |
所有其他類型的基類 |
string |
0個或多個Unicode字元所組成的序列 |
dynamic |
在使用動態語言編寫的程式集時使用 |
③ C#有6種類型可以由使用者自己建立,分別是 類類型(class),結構類型(struct),數群組類型(array),枚舉類型(enum),委託類型(delegate),介面類型(interface)。
二、棧和堆
1、棧
① 是一個記憶體數組,是一個後進先出(LIFO)的資料結構。
② 棧儲存幾種類型的資料:某些類型變數的值、程式當前的執行環境、傳遞給方法的參數。
③ 資料只能從棧的頂端插入和刪除。
④ 把資料放到棧頂成為入棧(push)。
⑤ 從棧頂刪除資料稱為出棧(pop)。
2、堆
① 是一塊記憶體地區,在堆裡可以分配大塊的記憶體用於儲存某類型的資料對象。
② 堆與棧不同的是,堆裡的記憶體能夠以任意順序存入和刪除。
三、實值型別與參考型別
類型除了決定了儲存資料需要的記憶體大小以及組成該類型的資料成員,還決定了類型的對象在記憶體中的儲存位置,於是類型又被分為兩種,實值型別和參考型別。
1、實值型別:資料存放在棧裡。
2、參考型別:引用存放在棧裡,資料存放在堆裡。
3、當資料是另一個對象的成員,儲存方式會有些不同。
① 參考型別的對象的資料始終存放在堆裡。
② 實值型別的對象的資料或參考型別的引用可以存放在棧裡,也可以存放在堆裡,這依賴於實際環境。
如參考型別的執行個體S,它有兩個成員,實值型別成員A,參考型別成員B。
儘管成員A是實值型別,但它也是參考型別的執行個體S的資料的一部分,所以存放在堆裡。
而成員B是參考型別,它的資料部分會始終存放在堆裡,它的引用部分因為也作為S的資料的一部分,所以也會被存放在堆裡。
四、變數
1、分類
① 本地變數:在方法的範圍儲存臨時資料,不是類型的成員。
② 欄位:儲存和類型或類型執行個體相關的資料,是類型的成員。
③ 參數:用於從一個方法到另一個方法傳遞資料的臨時變數,不是類型的成員。
④ 數組元素:通常是同質資料項構成的有序集合的一個成員,可以為本地變數,也可以為類型的成員。
2、無初始化語句的本地變數有一個未定義的值,在賦值之前不能使用,試圖使用未定義的本地變數會導致編譯器產生一條錯誤資訊。
3、自動初始化:一些類型的變數如果在聲明時沒有初始化語句,那麼會被自動設為預設值,而一些則不能。
表三 變數
變數類型 |
儲存位置 |
是否自動初始化 |
本地變數 |
棧 或 棧和堆 |
否 |
類欄位 |
堆 |
是 |
結構欄位 |
棧或堆 |
是 |
參數 |
棧 |
否 |
數群組類型 |
堆 |
是 |
4、多變數聲明
① 多變數聲明中的變數必須類型相同。
②變數名間必須用逗號分隔,可以在變數名後包含初始化語句。
5、靜態類型和dynamic關鍵字
① 靜態類型:變數的類型在編譯的時候已經確定並且不能在運行時修改。
② dynamic關鍵字:代表一個特定的、實際的C#類型,它知道如何在運行時解析自身。在編譯時間,編譯器不會對dynamic類型的變數進行類型檢查,
而是,它會將與該變數以及與該變數的操作相關的所有資訊打包。在運行時,這些資訊將會被檢查,以確保它與變數所代表的實際類型保持一致,
否則,將在運行時拋出異常。
6、可空類型
在某些情況下,特別是使用資料庫的時候,你希望表示變數目前未儲存有效值。對於參考型別,可以把變數設定為null。但定義實值型別的變數時,不管它的內容是否時有效,
其記憶體都會進行分配。對於這種情況,可以使用一個布爾指標來和變數關聯,如果值有效,則設定為true,否則就設定為false,而用可空類型也可以來解決,可空類型允許建立可以標記為有效或無效的實值型別,
這樣就可以在使用它之前確定值的有效與否。
[第一天]C#學習筆記