1. 程式人生 > >.NET值型別引用型別

.NET值型別引用型別

值型別變數的賦值 值型別變數中儲存的是實際資料,在賦值的時候只是把資料複製一份,然後賦給另一個變數。

例子1:

  1. int var1=2;  
  2. int var2=var1; //編譯器會先複製var1的值,然後把它賦給var2.很明顯var2的值也為2 

引用型別變數的賦值 引用型別變數中儲存的是“指向實際資料的引用指標”。在進行賦值操作的時候,它和值型別一樣,也是先有一個複製的操作,不過它複製的不是實際的資料,而是引用(真實資料的記憶體地址)。

所以引用型別的變數在賦值的時候,賦給另一變數的實際上是記憶體地址。這樣賦值完成後,2個引用變數中儲存的是同一引用,他們的指向完全一樣。

例子2:

  1. class MyClass   
  2. {  
  3. publicint val;  
  4. }  
  5. struct MyStruct  
  6. {  
  7. publicint val;  
  8. }  
  9. class Program  
  10. {  
  11. staticvoid Main(string[] args)  
  12. {  
  13. MyClass objectA=new MyClass();  
  14. MyClass objectB=objectA; //引用變數的賦值 賦值操作完成後,兩個變數都指向同一記憶體地址
  15. objectA.val=10; //給objectA.val賦值=10 由於objectB和objectA指向同一記憶體地址,所以ojbectB.val的值也為10
  16. objectB.val=20; 
    //給objectB.val賦值=20 由於objectB和objectA指向同一記憶體地址,所以objectA.val的值也為20
  17. MyStruct structA=new MyStruct();  
  18. MyStruct structB=structA; //結構是值型別 賦值操作完成後,兩個結構中的結構資訊一致。注意是“結構中的資訊”一致。
  19. structA.val=30;  
  20. structA.val=40;  
  21. Console.WriteLine(objectA.val); //輸出結果是20
  22. Console.WriteLine(objectB.val); //輸出結果是20
  23. Console.WriteLine(structA.val); 
    //輸出結果是30
  24. Console.WriteLine(structB.val); //輸出結果是40
  25. Console.ReadLine();  
  26. }  

從上面2個例子可以看出,值型別變數的賦值操作,僅僅是2個實際資料之間的複製。而引用型別變數的賦值操作,複製的是引用,即記憶體地址,由於賦值後二者都指向同一記憶體地址,所以改變其中一個,另一個也會跟著改變,二者就像繫結在了一起