下面是我關於值型別與引用型別的一些思考,錯誤之處肯定有的,歡迎高人批評指正,幫助進步
c#中,值型別和引用型別是兩個非常重要的概念,下面盡量詳細的闡述,觀點不一定完全正確,歡迎批評指正。
1.記憶體分為堆和棧,值型別的資料儲存在棧中,引用型別的資料儲存在堆中。
2.int numb=10,**中的10是值型別的資料,numb只是乙個指向10的變數而已。其中10儲存在棧中,變數numb也儲存在棧中。
3.person p=new person(),**中 new person()所建立的物件儲存在堆中,變數p儲存在棧中。
4.綜合第2點和第3點所有變數都儲存在棧中,無論此變數儲存的值是值型別和引用型別。
5.值型別包括列舉,結構以及像int,datetime這樣的簡單型別;引用型別包括類,介面,委託等。
6.值型別傳遞的值的拷貝,引用型別傳遞的是值的引用,即此資料在記憶體中的位址,這是最核心的概念,例項展示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class
program
;
person lilei =
new
person() ;
int
age = yaohongbo.age;
yaohongbo.age = 27;
person zhangsan = lilei;
lilei.name =
"李磊"
;
console.writeline(
"yaohongbo的age:"
+yaohongbo.age);
console.writeline(
"age:"
+ age);
console.writeline(
"lilei的name:"
+ lilei.name);
console.writeline(
"zhangsan的name:"
+ zhangsan.name);
console.readkey();
}
}
class
person
//引用型別
public
int
age
//值型別
}
輸出結果如下圖:
**說明:yaohongbo.age是int型別,為值型別,所以**int age=yaohongbo.age,是將yaohongbo.age變數儲存的值複製了乙份,然後讓變數age儲存這份拷貝,此拷貝和yaohongbo.age無任何關係,所以我們才可以看到上面的輸出結果。
再看**:
1
2
person zhangsan = lilei;
lilei.name =
"李磊"
;
person為自定義類,為引用型別,而引用型別穿的是引用,變數zhangsan指向的資料和變數lilei是同乙個記憶體位址,即同乙個物件,而不是像值型別那樣,拷貝了乙份變數lilei指向的資料給變數zhangsan。所以才會出現無論更改zhangsan韓式lilei的屬性值,其他乙個都會改變的情況。
最後通過一張圖來描述上面**。
C 值型別與引用型別
1.主要內容 型別的基本概念 值型別深入 引用型別深入 值型別與引用型別的比較及應用 2.基本概念 c 中,變數是值還是引用僅取決於其資料型別。c 的基本資料型別都以平台無關的方式來定義,c 的預定義型別並沒有內置於語言中,而是內置於.net framework中。net使用通用型別系統 cts 定...
c 引用型別與值型別
c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。在c 中函式傳值的特點 1.對於複雜的資料型別,按引用傳遞的效率更高,因為在按值傳遞時,必須複製大量的資料 2.除非特別指定,所有的引用型別都...
C 值型別與引用型別
資料型別分為 值型別 引用型別 值型別 int char double bool 結構 struct 列舉 enum 儲存在堆疊中 引用型別 類 string。陣列 介面 儲存在託管堆中 2.值型別 變數儲存物件的值,賦值會建立值的副本,修改任何乙個副本,不會影響其他的 副本 int x 5 int...