工作許久了,可是對c#中的值型別和引用型別卻一直無法很好的理解。這兩天花了不少時間查詢資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日後自己檢視,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎麼理解值型別和引用型別!
值型別資料直接在他自身分配到的記憶體中儲存資料,而引用型別只是包含指向儲存資料位置的指標。
那麼有哪些型別是值型別的呢,我把他們歸納成三類:
基礎資料型別(string型別除外):包括整型、浮點型、十進位制型、布林型。
結構型別:就是 struct 型
列舉型別:就是 enum 型
引用型別有五種:class、inte***ce、delegate、object、string
上面說的是怎麼區分哪些值型別和引用型別,而使用上也是有區別的。所有值型別的資料都無法為null的,宣告後必須賦以初值;引用型別才允許為null。
code:
inti=0;
//或者
inti=new
int();
//以上兩種都是可以正確的且是等同的
inti=null;//這樣的語句是無法通過編譯的,因為i是值型別的,是不允許為null的
classc=null;//這樣則是可以通過編譯的,這裡的c是引用型別的,允許為null
值型別和引用型別在賦值(或者說複製)的時候也是有區別的。值型別資料在賦值的時候是直接複製值到新的物件中,而引用型別則只是複製物件的引用。例如:
code:
public
classabc }
public
static
voidmain()
",i);
console.writeline("j=",j);
//結果是:
//i=1
//j=0
abca1=newabc();
abca2=a1;
a1.attribute=2;
console.writeline("a1=",a1.attribute);
console.writeline("a2=",a2.attribute);
//結果是:
//a1=2
//a1=2
}這個例子就很好的說明了值型別和引用型別的不同了。
最後還有值型別要麼是分配在堆疊的,要麼就是在結構中以內聯方式分配的。引用型別是分配在堆的。引用型別和值型別都是從基類 object 派生出來的。當值型別需要充當物件時,就在堆上分配乙個包裝(該包裝能使值型別看上去像引用物件一樣),並且將該值型別的值複製給它。該包裝被加上標記,以便系統知道它包含乙個值型別。這個程序稱為裝箱,反過來操作就稱為拆箱。裝箱和拆箱能夠使任何型別像物件一樣進行處理。
值型別與引用型別
直白點兒說 值型別就是現金,要用直接用 引用型別是存摺,要用還得先去銀行取現。麥機長 我覺得這話十分形象。宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址...
值型別與引用型別
自動變數型別是指儲存於該程式 程序 堆疊空間的一種變數型別 注意此時的堆疊空間並不是組合語言上的堆疊,只是它的使用及釋放類似於堆疊的過程 這個變數型別的乙個特點是它在程式執行時存在,在程式結束時消失。正是這個過程類似於彙編裡棧的操作,所以才將其命名 處理 為堆疊。我們平時所定義的int之類的型別都屬...
值型別與引用型別
引用型別 結構體byte,short,int,long,float,double,decimal,char,bool,enum和struct 統稱為值型別。函式返回以後,釋放記憶體 class person void test1 int a 與上方的a不是同乙個記憶體。引數變數,分配在棧上。函式返回...