003-可空类型 事件 简化委托
我们一直有这样一个问题,为什么值类型变量不能初始化为空?int i=null;这样写明显是错的,因为我们知道只有引用类型的变量才可以为设为null。其实在现实当中,我们也是需要让值类型变量为空的,这个问题经常出现在数据库问题中,因为这个原因,在c#中微软就出现了可空类型,nullable<T>,本章其实我们用的并不多,所以我们只是简单的了解一下,这个问题将会在数据库的章节中去学习到。
可空类型的核心是System.Nullable<T>与System.Nullable。这个就是一个类,这个现成类中有很多的方法其实我们就一点不奇怪了。下面是Nullable的代码:
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 ?
它是指定可空类型的一种快捷方式。所以,现在不需要写Nullable<byte>,写byte?就可以了。两者可以互换使用。写下来看代码:
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);
好了,这就是代码。
接下来看??
空合并操作符 比如 first ??second ,大职会经历一下的步骤:
对first进行求值。
如果结果为非空,则结果作为整个表达式的结果;
否则求second的值,其结果作为整个表达式的结果。
好了,这就是深入理解C#(三版)p110的原话,再加上一段代码就结束可空类型了:
DetaTime lastAlive =death??DateTime.Now; 这个就是一个简写的方式。
好了现在正式开始本章的重点,这个部分将会非常详细。
事件
我们知道委托的意思就是间接完成某项操作