程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 可空類型(Nullable<T>)及其引出的關於explicit、implicit的使用,nullableimplicit

可空類型(Nullable<T>)及其引出的關於explicit、implicit的使用,nullableimplicit

編輯:C#入門知識

可空類型(Nullable<T>)及其引出的關於explicit、implicit的使用,nullableimplicit


問題一:Nullable<T>可賦值為null

先看兩行C#代碼

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

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

Nullable<T>是非常特殊結構類型,它可賦值為null(所以此前我還以為是引用類型),其本質是等同於new;

通過調試可發現上述兩個值均為null,但是事實上我們卻可以調用他們的一些屬性方法比如“HasValue”,由此可見“=null“只是障眼法罷了;

此時如果調用他們的”Value“屬性將引發”InvalidOperationException“異常,注意不是空引用異常,異常信息為”其他信息: 可為空的對象必須具有一個值。”;

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

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

 

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

 仍然看兩行C#代碼

            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";

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved