一.數據類型 值類型 引用類型 數組 類(自定義類) 字元串 介面 Object 委托 指針類型 官方給出的說明 在指針類型中的 * 之前指定的類型被稱為“referrent 類型”。 以下任一類型均可為 referrent 類型: 任何整型類型:sbyte、byte、short、ushort、in ...
一.數據類型
- 值類型
類型 | 描述 | 範圍 | 預設值 |
---|---|---|---|
bool | 布爾值 | True 或 False | False |
byte | 8 位無符號整數 | 0 到 255 | 0 |
char | 16 位 Unicode 字元 | U +0000 到 U +ffff | '\0' |
decimal | 128 位精確的十進位值,28-29 有效位數 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
double | 64 位雙精度浮點型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D |
float | 32 位單精度浮點型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
int | 32 位有符號整數類型 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64 位有符號整數類型 | -923,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
sbyte | 8 位有符號整數類型 | -128 到 127 | 0 |
short | 16 位有符號整數類型 | -32,768 到 32,767 | 0 |
uint | 32 位無符號整數類型 | 0 到 4,294,967,295 | 0 |
ulong | 64 位無符號整數類型 | 0 到 18,446,744,073,709,551,615 | 0 |
ushort | 16 位無符號整數類型 | 0 到 65,535 | 0 |
- 引用類型
- 數組
- 類(自定義類)
- 字元串
- 介面
- Object
- 委托
- 指針類型
-
官方給出的說明
-
在指針類型中的
*
之前指定的類型被稱為“referrent 類型”。 以下任一類型均可為 referrent 類型:- 任何整型類型:sbyte、byte、short、ushort、int、uint、long、ulong。
- 任何浮點類型:浮點、雙精度。
- 字元。
- 布爾型。
- 小數。
- 任何枚舉類型。
- 任何指針類型。 這允許如
void**
的表達式。 - 任何僅包含非托管類型欄位的用戶定義的結構類型。
指針類型不從對象繼承,並且指針類型與
object
之間不存在轉換。 此外,裝箱和取消裝箱不支持指針。但是,你可在不同的指針類型之間以及指針類型和整型之間進行轉換。在同一個聲明中聲明多個指針時,星號 (*) 僅與基礎類型一起寫入;而不是用作每個指針名稱的首碼。 例如:
C#int* p1, p2, p3; // Ok int *p1, *p2, *p3; // Invalid in C#
指針不能指向引用或包含引用的結構,因為無法對對象引用進行垃圾回收,即使有指針指向它也是如此。垃圾回收器並不跟蹤是否有任何類型的指針指向對象。
- 指針簡單應用
-
//指針 unsafe { char* cptr = stackalloc char[26];//分配記憶體 //stringAppend(); for (int i = 0; i < 26; i++) { cptr[i] = (char)(i + 65); } for (int i = 0; i < 26; i++) { Console.WriteLine(string.Format("{0}:{1}",(int)&cptr[i],cptr[i])); } }定義一個char類型指針並分配26位元組記憶體,for迴圈給指針賦值,輸出int類型指針地址及它轉化位string的值:
- 結果為:
-
- 在記憶體中查看 :調試-》視窗-》記憶體-》記憶體1 ,我們把int類型指針值複製到地址欄,vs自動轉化位十六進位, 右鍵-》帶符號顯示 ,得到結果為char對應的數字
-
-
-
- 引用類型
二. 基本類型主要差異
- 基本類型:值類型,引用類型
- 相同點:
- 引用類型可以實現介面,值類型當中的結構體也可以實現介面;
- 引用類型和值類型都繼承自System.Object類。
- 相同點:
- 基本類型:值類型,引用類型
2.不同點
1.值類型直接儲存在記憶體棧中,引用類型在棧中儲存它在堆中記憶體單位的地址。
2.值類型存取速度快,引用類型存取速度慢。
3.值類型表示實際數據,引用類型表示指向存儲在記憶體堆中的數據的指針或引用。
4.值類型繼承自System.ValueType,引用類型繼承自System.Object。
5. 棧的記憶體分配是自動釋放;而堆在.NET中會有GC來釋放。
二. 類型之占用記憶體
1.值類型占用記憶體
Console.WriteLine("bool size:{0}", sizeof(bool)); Console.WriteLine("byte size:{0}", sizeof(byte)); Console.WriteLine("char size:{0}", sizeof(char)); Console.WriteLine("decimal size:{0}", sizeof(decimal)); Console.WriteLine("double size:{0}", sizeof(double)); Console.WriteLine("float size:{0}", sizeof(float)); Console.WriteLine("int size:{0}", sizeof(int)); Console.WriteLine("long size:{0}", sizeof(long)); Console.WriteLine("sbyte size:{0}", sizeof(sbyte)); Console.WriteLine("short size:{0}", sizeof(short)); Console.WriteLine("uint size:{0}", sizeof(uint)); Console.WriteLine("ulong size:{0}", sizeof(ulong)); Console.WriteLine("ushort size:{0}", sizeof(ushort)); Console.WriteLine("--------------------------------------");
· 1位元組=8位 與值類型描述一致;
2. 引用類型占用記憶體不固定, 根據它所創建的對象對應的數據大小不同而不同。