C#Nullable類型,C#溢出檢查,typeof運算子和運算子的重載

來源:互聯網
上載者:User

1)Nullable類型

一個Nullable類型就是基本類型加上一個“是否為null指標”的合成類型。對於一個類型,如果既可以給它分配一個值,也可以給它分配null引用(表示沒有任何值),我們就說這個類型是可以空的。因此,可空類型可表示一個值,或表示不存在任何值。例如,類似String的參考型別就是可空類型,而類似Int32的實值型別不是可空類型。由於實值型別的容量只夠表示適合於該類型的值,因此它不可為空白。

有些人認為int型變數的值為0就表示空,這是不對的,0也是它的值,而並不表示空。

看下面的代碼示範:

 1 static void Main(string[] args) 2         { 3             //int n = null; 4             //當直接給int類型賦值null時,編譯器報錯“無法將Null型轉化為int型,因為它是一種不可以為null型的類型” 5             int? oneValue = null; 6             //定義Nullable類型和定義非Nullable類型非常相似,關鍵在於類型後面的修飾符“?” 7             //int? oneValue = 10; 8             if (oneValue.HasValue)//使用Nullable類型的HasValue屬性來判定是否有值儲存 9             {10                 //int nNum = oneValue;11                 //如果嘗試擷取oneValue的值,編譯器就會報錯12                 Console.WriteLine(oneValue.Value);13             }14             else15             {16                 Console.WriteLine("oneValue的值為空白!");17             }18         }

2)C#的溢出檢查

 當一種整型轉換到另一種整型,這個過程取決於溢出檢查上下文。checked關鍵字用於對整型算術運算和轉換顯式啟用溢出檢查,而unchecked關鍵字則用於取消整型算術運算和轉換的溢出檢查。

①啟用溢出檢查:當運算元的值在目標類型的取值範圍內,則轉換成功,否則將要拋出異常。

看下面代碼示範:

 1 class TypeConvert 2     { 3         static void Main(string[] args) 4         { 5             TypeConvert typeConvert = new TypeConvert(); 6             typeConvert.DoSomething(); 7         } 8  9         public void DoSomething()10         {11             //MyInt的值為214748364712             try13             {14                 int MyInt = int.MaxValue;15                 byte MyByte = checked((byte)MyInt);16             }17             catch(OverflowException)18             {19                 throw;20             }21         }22     }

在代碼中MyInt的最大值是2147483647,在強制轉換為byte類型後,由於byte的取值範圍為0-255,在這裡使用了checked關鍵字進行了溢出檢查,這裡的byte型MyByte型無法容納遠大於其容量的值而拋出異常。

②取消溢出檢查

在類型轉換的過程中不檢查資料是否超過目標資料類型的最大值,意味著類型轉換永遠是成功的。如果來源資料類型的取值範圍大於目標類型的取值範圍,超過的部分將會被截取掉;如果來源資料的取值範圍小於目標類型的,轉換後將使用符號或者零填充至與目標類型的大小相等;如果等於,則直接轉換成目標類型

看執行個體代碼如下:

 1  1 class TypeConvert 2  2     { 3  3         static void Main(string[] args) 4  4         { 5  5             TypeConvert typeConvert = new TypeConvert(); 6  6             typeConvert.DoSomething(); 7  7         } 8  8  9  9         public void DoSomething()10 10         {11 11             //MyInt的值為214748364712 12             try13 13             {14 14                 int MyInt = int.MaxValue;15 15         //byte MyByte = unchecked(byte)MyInt;16 16         //這樣寫與下面的寫法一樣,區別就是生命了關鍵字17 17                 byte MyByte = (byte)MyInt;18 18         //這裡沒有使用溢出檢查,結果也不會拋出異常。但是轉換的結果是有問題的,是byte類型的最大值255,與原始的值相差很大。19 19             }20 20             catch(OverflowException)21 21             {22 22                 throw;23 23             }24 24         }25 25     }
③typeof運算子
typeof是一元運算子,用於返回任意一個類型的類型資訊
typeof運算子的文法如下:  Type type=typeof(類型);
範例程式碼示範如下:
 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             Type t = typeof(Program); 6             Console.WriteLine("方法:"); 7  8             MethodInfo[] methodInfo = t.GetMethods(); 9             //返回該Type類型的所有公用方法10             foreach (MethodInfo mInfo in methodInfo)11             {12                 Console.WriteLine(mInfo.ToString());13             }14 15             Console.WriteLine("成員:");16             MemberInfo[] memberInfo = t.GetMembers();17             //返回該Type類型的所有公用成員18             foreach (MemberInfo mInfo in methodInfo)19             {20                 Console.WriteLine(mInfo.ToString());21             }22 23             Console.ReadKey();24         }25     }
運行結果如:

④運算子的重載

運算子多載只能應用於類或結構。要重載一個運算子,可以聲明一個名為operator X的方法並實現它,如operator +和operator -,一元運算子和二元運算子都可以被重載,相應地,重載方法分別帶一個或者兩個參數(類或者結構類型),其文法為:

 //一元運算子的重載       

 public static 自訂類型 operator 要重載的運算子(類型)       

//二元運算子的重載       

 public static 自訂類型 operator 要重載的運算子(類型1,類型2)

注意:所有運算子的重載均是靜態方法,必須得用public修飾

程式碼範例如下:

 1 class Program 2     { 3         public int Value { get;set; } 4  5         static void Main(string[] args) 6         { 7             Program o1 = new Program(); 8             o1.Value = 10; 9             Program o2 = new Program();10             o2.Value = 20;11 12             Program o3 = o1 + o2;13             Console.WriteLine(o3.Value);14             Console.ReadKey();15         }16 17         /// <summary>18         /// 這裡為Program類重載了“加(+)”運算子實現了兩個對象的相加的功能,運算子的重載提高了編程的便利性19         /// </summary>20         /// <param name="o1"></param>21         /// <param name="o2"></param>22         /// <returns></returns>23         public static Program operator +(Program o1, Program o2)24         {25             Program o = new Program();26             o.Value = o1.Value + o2.Value;27             return o;28         }29     }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.