《C#面向对象程序设计课件郑宇军CS章节12章》由会员分享,可在线阅读,更多相关《C#面向对象程序设计课件郑宇军CS章节12章(30页珍藏版)》请在金锄头文库上搜索。
1、1,第12章 C# 中的泛型模式: 可空类型和迭代器,可空类型,值类型与null值,2,public class student private string name; private DateTime birthday; private bool gender; ,null,未初始化,可空类型,值类型与null值,3,public class student private string name; private DateTime birthday; private bool gender; public Student() birthday = new DateTime(1900,1,
2、1); gender = false; ,?,值类型与null值,可空类型,4,public struct IntOrNull private int value; private bool hasValue; public int Value get if (hasValue) return value; else throw new InvalidOperationException(); ,Int,Null,IntOrNull,值类型与null值,可空类型,5,Int,Null,IntOrNull,Double,Null,Double OrNull,DateTime,Null,DateT
3、ime OrNull,使用可空类型,可空类型,6,public struct Nullable private T value; private bool hasValue; public T Value get if (hasValue) return value; else throw new InvalidOperationException(); ,T,Null,TOrNull,where T : struct,可空类型,使用可空类型 Nullable,7,Nullablei1 = null; Nullablei1 = new Nullable() Nullable dt1 = Dat
4、eTime.Now;,可空类型,使用可空类型 Nullable T?,8,Nullablei1 = null; Nullablei1 = new Nullable() Nullable dt1 = DateTime.Now;,int ? i1 = null; double ? d1 = 2.5; DateTime ? dt1 = DateTime.Now; DateTime ? dt2 = new DateTime?(dt1);,可空类型,可空类型转换 隐式转换,9,int i1 = 3; int? i2 = i1;,Nullable,T,可空类型,可空类型转换 隐式转换,10,int i =
5、 3; double? d = i;,Nullable,T,S,可空类型,可空类型转换 隐式转换,11,float? f = 3.14f; double? d = f;,Nullable,Nullable,T,S,可空类型,可空类型转换 隐式转换 显式转换,12,int? i1 = new int?(3); int i2 = (int)i1;,T,Nullable,可空类型,可空类型转换 隐式转换 显式转换,13,float? f = 3.14f; int i = (int)f;,S,T,Nullable,可空类型,可空类型转换 隐式转换 显式转换,14,float? f = 3.14f; i
6、nt? i = f;,Nullable,S,T,Nullable,操作符提升,可空类型,15,Nullable: t1 op t2 = t3,T: t1 op t2 = t3,比较操作符: null = null 关系操作符: (t1/t2: null) t3=false 一般操作符: (t1/t2: null) t3=null,可遍历类型和接口 预定义类型,遍历和迭代,16,int x = 1, 3, 5, 7, 9 ; foreach (int i in x) Console.WriteLine(i); ArrayList a1 = new ArrayList(x); foreach (i
7、nt i in a1) Console.WriteLine(i); Stack s = new Stack(x); foreach (int i in s) Console.WriteLine(i);,Array: IEnumerable ArrayList: IEnumerable Stack: IEnumerable,可遍历类型和接口 预定义类型 自定义类型,遍历和迭代,17,public class Phones private string phones; ,可遍历类型和接口 预定义类型 自定义类型,遍历和迭代,18,public class Phones : IEnumerable
8、private string phones; IEnumerator IEnumerable.GetEnumerator() for(int i=0; i5; i+) if(phonesi != null) yield return phonesi; ,可遍历类型和接口 预定义类型 自定义类型,遍历和迭代,19,public class Phones : ICollection private string phones; IEnumerator IEnumerable.GetEnumerator() for(int i=0; i5; i+) if(phonesi != null) yield
9、 return phonesi; public int Count get . public void CopyToArray(Array arr, int i) . ,可遍历类型和接口 预定义类型 自定义类型,遍历和迭代,20,public class Phones : IEnumerable private string phones; public IEnumerator GetEnumerator() for(int i=0; i5; i+) if(phonesi != null) yield return phonesi; public int Count get . public
10、void CopyToArray(Array arr, int i) . ,遍历和迭代,迭代器,21,foreach (string s in phones) Console.WriteLine(s);,IEnumerator enu = phones.GetEnumerator(); while (enm.MoveNext() Console.WriteLine(enu.Current);,遍历和迭代,IEnumerator T Current bool MoveNext() void Reset(),22,遍历和迭代,迭代器,23,准备(before),MoveNext,运行(runnin
11、g),挂起(suspended),get _Curent,完成,结束,遍历结束?,开始(Start),False,True,False,True,遍历和迭代,迭代器代码,24,IEnumerator IEnumerable.GetEnumerator() for(int i = 0; i5; i+) if(phonesi != null) yield return phonesi; ,遍历和迭代,迭代器代码,25,IEnumerator IEnumerable.GetEnumerator() for(int i = 0; i5; i+) if(phonesi != null) yield re
12、turn phonesi; else yield break; ,遍历和迭代,26,迭代器代码 不能使用ref/ out参数 不能出现单独的return语句,遍历和迭代,使用多个迭代器,27,public class Phones : IEnumerable public IEnumerator GetEnumerator() . yield return . ,遍历和迭代,使用多个迭代器,28,public class Phones : IEnumerable public IEnumerator GetEnumerator() . yield return . public IEnumer
13、able EnumeratorA() . yield return . public IEnumerable EnumeratorB() . yield return . ,遍历和迭代,自我迭代,29,public class Phones : IEnumerable, IEnumerator public IEnumerator GetEnumerator() . yield return . public int Count get . public void CopyToArray(Array arr, int i) . ,30,本章习题,简述可空类型的使用场合。 将null赋值给一个可空类型变量,该类型对象是怎样初始化的? C#的迭代器功能使用了哪些关键字,它们各有什么用途? 在图书馆管理系统中实现用户和图书的遍历。,