.NET值型別引用型別
阿新 • • 發佈:2019-02-03
值型別變數的賦值: 值型別變數中儲存的是實際資料,在賦值的時候只是把資料複製一份,然後賦給另一個變數。
例子1:
- int var1=2;
- int var2=var1; //編譯器會先複製var1的值,然後把它賦給var2.很明顯var2的值也為2
引用型別變數的賦值: 引用型別變數中儲存的是“指向實際資料的引用指標”。在進行賦值操作的時候,它和值型別一樣,也是先有一個複製的操作,不過它複製的不是實際的資料,而是引用(真實資料的記憶體地址)。
所以引用型別的變數在賦值的時候,賦給另一變數的實際上是記憶體地址。這樣賦值完成後,2個引用變數中儲存的是同一引用,他們的指向完全一樣。
例子2:
- class MyClass
- {
- publicint val;
- }
- struct MyStruct
- {
- publicint val;
- }
- class Program
- {
- staticvoid Main(string[] args)
- {
- MyClass objectA=new MyClass();
- MyClass objectB=objectA; //引用變數的賦值 賦值操作完成後,兩個變數都指向同一記憶體地址
- objectA.val=10; //給objectA.val賦值=10 由於objectB和objectA指向同一記憶體地址,所以ojbectB.val的值也為10
- objectB.val=20;
- MyStruct structA=new MyStruct();
- MyStruct structB=structA; //結構是值型別 賦值操作完成後,兩個結構中的結構資訊一致。注意是“結構中的資訊”一致。
- structA.val=30;
- structA.val=40;
- Console.WriteLine(objectA.val); //輸出結果是20
- Console.WriteLine(objectB.val); //輸出結果是20
- Console.WriteLine(structA.val);
- Console.WriteLine(structB.val); //輸出結果是40
- Console.ReadLine();
- }
- }
從上面2個例子可以看出,值型別變數的賦值操作,僅僅是2個實際資料之間的複製。而引用型別變數的賦值操作,複製的是引用,即記憶體地址,由於賦值後二者都指向同一記憶體地址,所以改變其中一個,另一個也會跟著改變,二者就像繫結在了一起