C#中對實值型別和參考型別的一點認識

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   strong   

區別實值型別和參考型別的重要一點就是實值型別賦值的時候是給出一塊記憶體空間,空間裡放下要賦給實值型別的值。而參考型別是開闢一塊記憶體空間,空間裡放下的是要賦給參考型別值的指向地址。

就像一個是複製了銀行卡裡的現金,你花了你複製的現金,和該銀行卡是沒有關係的。而參考型別是複製了一個銀行卡,此卡為銀行卡的副卡,因為他們的指向地址是一樣的,所以當你使用副卡

的時候,主卡裡的錢也會隨之變動。

下面給出一段代碼。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace WindowsConsoleApplicationValueAndReference{    class Program    {        static void Main(string[] args)        {            ReferenceAndValue.ReferenceAndValueMethod();                    }    }    public class Person    {        public string Name { get; set; }        public int Age { get; set; }    }    public static class ReferenceAndValue    {        public static void ReferenceAndValueMethod()        {            Person tang = new Person { Name = "Andelshejlsberge", Age = 25 };            int age = tang.Age;//age=tang.age=25            tang.Age = 22;            Person name = tang;//name.Name=andelshejlsberge            tang.Name = "tangxuelong";//tang.name=tangxuelong name.name=tang.name=tangxuelong            Console.WriteLine("tang.Name={0}",tang.Name);            Console.WriteLine("tang.age={0}", tang.Age);            Console.WriteLine("age={0}", age);            Console.WriteLine("name={0}", name.Name);            Console.ReadLine();        }    }}

分析一下代碼。首先建立了一個person類,該類中包含name和age倆個屬性

我們在方法中建立person的對象tang,初始化對象的name和age。

這時候看下一步,我們將對象tang的age賦值給一個int類型的變數age,然後改變對象tang的age的值,運行結果會告訴我們,此時age=25,tang.age=22;

接下來我們繼續看下面的代碼,繼續建立一個對象將tang賦值給該對象。那麼此時如果加入斷點的話我們都知道name.Name=tang.Name=andershejlsberge這是沒錯的。那麼接下來像上面一樣我們改變tang.name的值我們會發現,name.name的值此時也改變了。

就像開始說的那樣,參考型別不僅僅分配了記憶體空間,還解析了記憶體塊的指向地址。

裝箱和拆箱

裝箱和拆箱其實就是參考型別和實值型別之間的轉換

實值型別轉換為參考型別就是裝箱,參考型別轉換為實值型別就是拆箱。

public static class boxingAndUnboxing    {        public static void boxingandunboxing()        {            int ageInt = new int();            //boxing            object age =(object)ageInt;            age = null;            //unboxing            ageInt = (int)age;            Console.WriteLine(ageInt);        }    }

分析一下上面的代碼。這段代碼會拋出System.NullReferenceException異常,因為age為參考型別,參考型別是可以賦空值的,然後將參考型別轉換為實值型別時,參考型別沒有值。。

所以就拋出了異常。而去掉這段代碼輸出結果為0,這是因為我們沒有初始化,預設的實值型別變數的值就為0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.