C#
Programming
class | struct | |
---|---|---|
繼承(inheritance) | 可以 | 不可以 |
介面(interface) | 可以 | 可以 |
NULL | 可以為null | 不可以為null |
型態 | 參考型態(reference type) | 實值型態(value type) |
Memory Allocation | Heap | Stack |
C# 中有兩種類型:
參考類型和實值類型。 參考類型的變數會儲存期資料 (物件) 的參考,而實值類型的變數則會直接包含其資料。 使用參考類型時,這兩種變數可以參考相同的物件,因此對其中一個變數進行的作業可能會影響另一個變數所參考的物件。用實值型別時,每個變數都有自己的資料複本,因此對某一個變數進行的作業,不可能會影響其他變數Microsoft Documents
實值型別(value type): 如常用的內建資料型別,例如: int
、float
、bool
都是實值型別 (object
和string
除外)。簡而言之,我們在使用這些實值型別時,例如傳遞參數,是複製一份相同的資料後,再對資料進行處理。
參考型別(reference type): 對參考型別進行操作的時候,是直接對記憶體的位置。進行處理。例如: 上述除外的object
和string
都是參考型別。
根據型別的不同,C#會將他們配進不同的記憶體位置中
ref
或out
等關鍵字,參數便會是實值型別。new
)出來的class
,就會被配在Heap,而那些class
裏頭實值型別的變數成員,也會是該class
的一員,配置在Heap中。上頭有句話:
在使用方法傳遞參數時,若沒有使用
ref
或out
等關鍵字,參數便會是實值型別。
若想傳入參數的記憶體位置可以在參數前面加上ref
或out
。
這兩個關鍵字的差別在於:
ref
在傳入方法之前必須初始化。out
在傳入方法之前不必初始化,但必須在方法內指派值才可回傳。這兩個不會進行overloading,因為參數傳遞的方式都是傳參考,compiler無法辨識。