咱们一直有这样一个问题,为何值类型变量不能初始化为空?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; 这个就是一个简写的方式。
好了如今正式开始本章的重点,这个部分将会很是详细。
事件
咱们知道委托的意思就是间接完成某项操做