實值型別(C# 參考)
實值型別主要由兩類組成:
結構分為以下幾類:
Numeric(數值)類型
bool
使用者定義的結構。
實值型別的主要功能
基於實值型別的變數直接包含值。將一個實值型別變數賦給另一個實值型別變數時,將複製包含的值。這與參考型別變數的賦值不同,參考型別變數的賦值只複製對對象的引用,而不複製對象本身。
所有的實值型別均隱式派生自 System.ValueType。
與參考型別不同,從實值型別不可能派生出新的類型。但與參考型別相同的是,結構也可以實現介面。
與參考型別不同,實值型別不可能包含 null 值。然而,可空類型功能允許將 null 賦給實值型別。
每種實值型別均有一個隱式的預設建構函式來初始化該類型的預設值。有關實值型別預設值的資訊,請參見預設值表。
簡單類型的主要功能
所有的簡單類型(C# 語言的組成部分)均為 .NET Framework 系統類別型的別名。例如,int 是 System.Int32 的別名。有關完整的別名列表,請參見內建類型表(C# 參考)。
編譯時間計算運算元均為簡單類型常數的常數運算式。
可使用文字初始化簡單類型。例如,“A”是 char 類型的文字,而 2001 是 int 類型的文字。
初始化實值型別
C# 中的局部變數經初始化後方可使用。因此,如果像下面這樣聲明了一個局部變數而未將其初始化:
int myInt;
那麼在將其初始化之前,無法使用此變數。可使用下列語句將其初始化:
myInt = new int(); // Invoke default constructor for int type.
此語句等效於:
myInt = 0; // Assign an initial value, 0 in this example.
當然,可以像下面這樣用同一個語句進行聲明和初始化:
int myInt = new int();
- 或 -
int myInt = 0;
使用 new 運算子時,將調用特定類型的預設建構函式並對變數賦以預設值。在上例中,預設建構函式將值 0 賦給了 myInt。有關通過調用預設建構函式所賦的值的更多資訊,請參見預設值表。
對於使用者定義的類型,使用 new 來調用預設建構函式。例如,下列語句調用了 Point 結構的預設建構函式:
Point p = new Point(); // Invoke default constructor for the struct.
此調用後,該結構被認為已被明確賦值;也就是說該結構的所有成員均已初始化為各自的預設值。
有關 new 運算子的更多資訊,請參見 new。
有關格式化數字類型輸出的資訊,請參見格式化數值結果表。
補充內容:
1.
實值型別一般放在棧上,
1)
如果實值型別是方法內的局部變數,他會在棧上分配記憶體;
2) 如果是執行個體對象成員變數時,它會在堆上分配記憶體(因為執行個體對象,對象本身就是參考型別來(指標放在棧),儲存在堆裡的,所以他當中的實值型別資料也是放在堆裡的)
2.參考型別的指標放在棧上,實際值放在堆上
如參考
|
實值型別 |
參考型別 |
變數中存放 |
真正的資料 |
指向資料的引用指標 |
記憶體空間分配 |
堆棧(Stack) |
託管堆(Managed Heap) |
記憶體需求 |
一般來說較少 |
較大 |
執行效能 |
較快 |
較慢 |
記憶體釋放時間點 |
執行超過定義變數的範圍 |
由資源回收筒負責回收 |
可以為null |
不可 |
可以 |