咱們一直有這樣一個問題,爲何值類型變量不能初始化爲空?int i=null;這樣寫明顯是錯的,由於咱們知道只有引用類型的變量才能夠爲設爲null。其實在現實當中,咱們也是須要讓值類型變量爲空的,這個問題常常出如今數據庫問題中,由於這個緣由,在c#中微軟就出現了可空類型,nullable<T>,本章其實咱們用的並很少,因此咱們只是簡單的瞭解一下,這個問題將會在數據庫的章節中去學習到。數據庫
可空類型的核心是System.Nullable<T>與System.Nullable。這個就是一個類,這個現成類中有不少的方法其實咱們就一點不奇怪了。下面是Nullable的代碼:c#
static void Display(Nullable<int> x) { Console.WriteLine("HasValue :{0}", x.HasValue); if(x.HasValue) { Console.WriteLine("Value:{0}", x.Value); Console.WriteLine("Explict conversion: {0}", (int)x); } Console.WriteLine("GetValueOrDefalut():{0}", x.GetValueOrDefault()); Console.WriteLine("GetvalueOrDefalut(10): {0}", x.GetValueOrDefault(10)); Console.WriteLine("ToString(): \"{0}\"", x.ToString()); Console.WriteLine("GetHashCode(): {0}", x.GetHashCode()); Console.WriteLine(); } static void Main(string[] args) { Nullable<int> x = 5;//這個隨即是什麼值,在下面的值纔是x的初始值 x = new Nullable<int>(5); Console.WriteLine("Instance with value:"); Display(x); x = new Nullable<int>(); Console.WriteLine("Instance without value:"); Display(x); }
這個類就是和其餘的類同樣,你須要實例化,而後你能夠在其實調用方法,每一個方法都會有它的功能。其實可空類型的部分並非不少,總結一下就是初始化 ? ??這三個方法的使用。接下來咱們就會簡單的瞭解一下,開始進入本章的重點,事件與進入快速通道的委託。學習
1 ?spa
它是指定可空類型的一種快捷方式。因此,如今不須要寫Nullable<byte>,寫byte?就能夠了。二者能夠互換使用。寫下來看代碼:code
int? nullable = 5; object boxed = nullable; Console.WriteLine(boxed.GetType()); int normal = (int)boxed; Console.WriteLine(normal); nullable = (int?)boxed; Console.WriteLine(nullable); nullable = new int?(); boxed = nullable; Console.WriteLine(boxed == null); nullable = (int?)boxed; Console.WriteLine(nullable.HasValue);
好了,這就是代碼。orm
接下來看??blog
空合併操做符 好比 first ??second ,大職會經歷一下的步驟:事件
對first進行求值。string
若是結果爲非空,則結果做爲整個表達式的結果;it
不然求second的值,其結果做爲整個表達式的結果。
好了,這就是深刻理解C#(三版)p110的原話,再加上一段代碼就結束可空類型了:
DetaTime lastAlive =death??DateTime.Now; 這個就是一個簡寫的方式。
好了如今正式開始本章的重點,這個部分將會很是詳細。
事件
咱們知道委託的意思就是間接完成某項操做