Presentation is loading. Please wait.

Presentation is loading. Please wait.

$10 可空类型.

Similar presentations


Presentation on theme: "$10 可空类型."— Presentation transcript:

1 $10 可空类型

2 可空类型 问题的提出:值类型允许取空值 可空类型声明: int+null  int? float+null  float?
Size+null  Size? ……

3 可空类型 对每个可为空的值类型增加一个新定义? 泛型解决方案:T+null  Nullable<T>
int? = Nullable<int> float? = Nullable<float> Size? = Nullable<Size> ……

4 可空类型 Nullable<T> where T: struct bool HasValue T Value
operator == != == 指的是要么二者的值都为null,要么二者都含有相等的基础类型的值。

5 可空类型 类型转换 转换规则一 任何可空类型都可以显示地转换到它所对应的基础类型,而基础类型则可以隐式地转换到对应的可空类型。
int i = 10; int? j = i; //隐式转换 j = 20; //隐式转换 int k = (int)j; //显式转换

6 可空类型 类型转换 转换规则二 从可空类型到非可空类型只可能存在显式转换,能够转换的条件是:存在从可空类型对应的基础类型到非可空类型的隐式或显示转换。 int? i = 10; short s = (short)i; //存在从int到short的显示转换 long l = (long)l; //存在从int到long的显示转换

7 可空类型 类型转换 转换规则三 从非可空类型到可空类型可能存在隐式或显式转换,能够进行转换的条件是:存在从非可空类型到可空类型对应的基础类型的隐式或显示转换。 short s = 5; long l = 1000; int? i = s; //存在从short到int的隐示转换 i = (int?)l; //存在从long到int的显示转换

8 可空类型 类型转换 转换规则四 从可空类型到其他可空类型可能存在隐式或显式转换,且能够进行转换的条件是:在两个可空类型的基础类型之间存在隐式或显示转换。 int? i = 5; double? d = 3.14; d = i; //存在从int到double的隐式转换 i = (int?)d; //存在从double到int的显式转换 //相当于三次显示转换的组合 i = (int?)((int)((double)d));

9 可空类型 类型转换 转换规则五 常量null可以被隐式转换为任何可空类型。在将空值null赋给可空类型的变量时,其实就已经隐含地进行了这种转换。 int? i = null; DateTime? d = null; 该转换规则不适用于任何为null的变量 object obj = null; double? d = obj;//错误,虽然object类型的变量obj的值也是空值,但它不是一个常量

10 可空类型 类型检查 is和as操作符也能作用于可空类型。对于Nullable<T>类型的变量x,这两个操作符的规则如下:
当x的值不为null时,表达式x is T和x is Nullable<T>的值均为true。 当x的值为null时,表达式x is T和x is Nullable<T>的值均为false。 空值结合 T? t1; T t2; T t = t1 ?? t2;

11 可空类型 操作符提升 如果某个操作符能够作用于某个值类型,那么它同样能够作用于该类型所对应的可空类型。即操作符的作用范围能从基础类型“提升”到可空类型。 提升后的操作符作用于可空类型时,如果表达式中的所有操作数都不含null值,那么操作符的作用效果和没有提升之前是一样的,只是在最后将基础类型隐式地转换为可空类型。而当表达式中出现了值为null的操作数时,操作符的作用效果比较复杂,分为以下几种情况: 对于关系操作符“!-”“==”,表达式的返回类型为bool类型,两个操作数均为null时返回true,,只有一个为null时返回false。 对于一元操作符”+”, ”-”, ”++”, ”--”, ”!”, ”~”,表达式的返回类型和操作数相同,且返回值为null。 对于二元操作符”+”, ”-”, ”*”, ”/”, ”%”以及位操作符”&”、”|”、 ”^”、”<<”和 ”>>”,表达式的返回类型和两个操作数的类型都相同,且返回值为null。 对于关系操作符”<”, ”>”, ”<=”, ”>=” ,表达式的返回类型为bool值,且返回类型为false。

12 可空类型 可空布尔类型:不符合提升规则 能够作用于布尔类型的操作符有”&”、”|”、 ”^”以及条件逻辑操作符”!”。作用于bool?类型的操作数时,只有异或操作符 ”^”和逻辑非操作符”!”符合提升规则。 对于与操作符”&”,只要有一 个操作数的值为false,表达式的值 就为false;而只要有一个操作数的值为true,表达式的值就是另一个操作数的值;两个操作数都为null时,表达式的值为null。 对于或操作符”|”,只要有一个操作数的值为true,那么表达式的值就为true;而只要有一个操作数为false,而表达式的值就是另一个操作数的值;两个操作数都为null时,表达式的值为null 。

13 $11 泛型接口、方法和委托

14 泛型接口 泛型接口、方法和委托

15 泛型接口 定义 类型参数 类型限制 使用 类型限制:类型参数需在被限制类型中出现! 继承:类型参数需在派生类型中出现!

16 泛型接口 常用泛型接口 IEnumerator<T> IEnumerable<T>
ICollection<T> Ilist<T> IComparable<T> IComparer<T> IEqualityComparer IDictionary<K, V>

17 泛型接口 泛型接口与类型限制 Demo

18 泛型方法 泛型接口、方法和委托

19 泛型方法 public class Math { static void Swap(ref int x, ref int y) {int t=x; x=y; y=t;} } public static void Main() double x = 0.5, y = 3;

20 泛型方法 public class Math<T> { static void Swap(ref T x, ref T y) { T t=x; x=y; y=t; } } public static void Main() double x = 0.5, y = 3; Math<double>.Swap(ref x, ref y); Math<double>.Sqrt(x); Math<double>.Power(x, y); ?

21 泛型方法 public class Math { static void Swap<T>(ref T x, ref T y) { T t=x; x=y; y=t; } } public static void Main() double x = 0.5, y = 3; Math.Swap<double>(ref x, ref y); Math.Power(x, y); Math.Swap(ref x, ref y);

22 泛型方法 同样可以进行类型限制 public T Max<T> (T x, T y) where T: IComparable
{ if(x.CompareTo(y) >= 0) return x; else return y; }

23 泛型方法 通过泛型方法实现多态性 Demo


Download ppt "$10 可空类型."

Similar presentations


Ads by Google