可空類型(Nullable)及其引出的關於explicit、implicit的使用

問題一:Nullable<T>可賦值爲nullspa

先看兩行C#代碼調試

            int? i1 = null;
            int? i2 = new int?();        

int? 即Nullable<int>,就像int之於Int32;code

Nullable<T>是很是特殊結構類型,它可賦值爲null(因此此前我還覺得是引用類型),其本質是等同於new;對象

經過調試可發現上述兩個值均爲null,可是事實上咱們卻能夠調用他們的一些屬性方法好比「HasValue」,因而可知「=null「只是障眼法罷了;blog

此時若是調用他們的」Value「屬性將引起」InvalidOperationException「異常,注意不是空引用異常,異常信息爲」其餘信息: 可爲空的對象必須具備一個值。」;ci

建議對於此類型的取值使用「GetValueOrDefault」方法來獲取,而不是判斷HasValue後去Value值;get

其次建議不進行」 == null 「的邏輯判斷,應使用HasValue屬性。string

 

問題二:Nullable<T> 可賦值爲 T類型it

 仍然看兩行C#代碼io

            int? iNull = 2;
            int i = (int)iNull;

很是常見的代碼,可是每行代碼都包含了類型,「int?」與int之間的隱式轉換與顯示轉換,而支持可空類型轉換的就是Nullable<T>提供了兩個方法:

        public static explicit operator T(Nullable<T> value);
        public static implicit operator Nullable<T>(T value);

operator是運算符重載,於是這倆貨也能夠當作是對「=」的運算符重載,explicit支持了顯示轉換,implicit支持了隱式轉換,使用以下:

    class UserInfo
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public static explicit operator UserInfo(int id)
        {
            Console.WriteLine("獲取用戶ID爲【{0}】的User對象", id);
            return new UserInfo { ID = id };
        }

        public static implicit operator UserInfo(string name)
        {
            Console.WriteLine("獲取用戶名爲【{0}】的User對象", name);
            return new UserInfo { Name = name };
        }
    }

調用:

            UserInfo user1 = (UserInfo)2;

            UserInfo user2 = "bajie";
相關文章
相關標籤/搜索