《《深入理解C#语言》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《深入理解C#语言》PPT课件.ppt(44页珍藏版)》请在金锄头文库上搜索。
1、 第14章 深入理解C#语言内容提要n类型与转换n变量及其传递n多态与虚方法调用n动态类型确定n对象构造与析构ncsharp语言新特性1 类型与转换数据类型nC#的数据类型分值类型(Value Type)和引用类型(Reference Type)两大类n值类型包括n简单类型(Simple Type)n结构类型(Struct Type)n枚举类型(Enum Type)n引用类型包括n类类型(Class Type)n数组类型(Array Type)n指代类型(Delegate)Reference and Value TypesReference引用型(Class)Value 值(Struct)分配
2、Heap 堆Inline 栈默认值NullZeroed= 的含义复制引用复制值变量中的内容引用实际值123123123123i i i is s s sHello worldHello worldHello worldHello worldint i = 123;int i = 123;int i = 123;int i = 123;123123123123j j j jt t t tint j = i;int j = i;int j = i;int j = i;string t = s;string t = s;string t = s;string t = s;string s = Hel
3、lo world;string s = Hello world;string s = Hello world;string s = Hello world;示例Class&Struct.cs值类型的转换n数字类型之间可以互相转化n隐式转换 float f = 3;n显式转换 int i = (int)3.14;n整型提升 sbyte a=1,b=2; a+b为int型n枚举类型与数字类型之间可以显式转换n结构类型之间不能转换 引用类型转换 n显式或隐式转换(都要求有继承关系)nPerson p = new Student(); /隐式转换nStudent s = (Student) p; /
4、显式转换n可能转成功,也可能异常nIRunnable r = p; /隐式转换nas 运算符nStudent s = p as Student; n可能成功,也可能为nullAsObject.cs引用类型与值类型的转换int i = 123;int i = 123;int i = 123;int i = 123;object o = i;object o = i;object o = i;object o = i;int j = (int) o;int j = (int) o;int j = (int) o;int j = (int) o;123123123123io123123123123S
5、ystem.Int32System.Int32System.Int32System.Int32“Boxing”“Unboxing”j? ?123123123123Boxing and unboxingUnboxing必须显式转换BoxingTest.csint total = 35;int total = 35;int total = 35;int total = 35;string s = String.Format(string s = String.Format(string s = String.Format(string s = String.Format( Your total w
6、as 0 on 1, total, date); Your total was 0 on 1, total, date); Your total was 0 on 1, total, date); Your total was 0 on 1, total, date);Hashtable t = new Hashtable();Hashtable t = new Hashtable();Hashtable t = new Hashtable();Hashtable t = new Hashtable();t.Add(0, zero);t.Add(0, zero);t.Add(0, zero);
7、t.Add(0, zero);t.Add(1, one);t.Add(1, one);t.Add(1, one);t.Add(1, one);DateTime d = DateTime.Now;DateTime d = DateTime.Now;DateTime d = DateTime.Now;DateTime d = DateTime.Now;String s = d.ToString();String s = d.ToString();String s = d.ToString();String s = d.ToString();/ no box/ no box/ no box/ no
8、boxint a = new int2;int a = new int2;int a = new int2;int a = new int2;a0 = 33;a0 = 33;a0 = 33;a0 = 33;/ no box/ no box/ no box/ no boxArrayList a = new ArrayList();ArrayList a = new ArrayList();ArrayList a = new ArrayList();ArrayList a = new ArrayList();a.Add(33);a.Add(33);a.Add(33);a.Add(33);/ box
9、 here/ box here/ box here/ box here2 变量及其传递域变量及局部变量n类static变量n相当于类中的“全局变量”n域变量n相当于对象中的变量n局部变量n在函数体及其中,在栈中分配,自动消失n域变量自动有初值,局部变量则不LocalVarAndMemberVar.cs按值传送的参数n按值传送n要注意值类型与引用类型nTransByValue.cs TransByValueStructClass.cs ref参数及out参数 nref参数在传之间必先赋值nout参数在函数中必须赋值后才能返回n表达式及对象的属性不能作ref及out参数nTransByRef.cs
10、nRefSwap.csnTransByOut.csnRefColorRGB.csparam参数n数组参数(相当于VB的可变参数)n参数必须放在最后n调用时,可用数组,也可用多个参数n定义:ndouble Multi( params double nums ) n调用nMulti();nMulti( 27 );nMulti( 3.14, 0.9, 0.9 );nMulti( 1,2,3,4,5);nMulti( new double 1,2,3,4,5 );ParamsTest.cs3 多态与虚方法调用 多态(Polymorphism)n在面向对象的系统中,多态性是一个非常重要的概念,它允许客户
11、对一个对象进行操作,由对象来完成一系列的动作,具体实现哪个动作、如何实现由系统负责解释。n在C#中,多态性的定义是,同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性。4-2两种类型的多态性 n编译时的多态性n编译时的多态是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。n运行时的多态性n运行时的多态性是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。n编译时的多态性提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。上溯造型与虚
12、方法调用VirtualInvokeShape.csstatic void doStuff( Shape s )s.draw();Shape c = new Circle();Shape r = new Rectangle();Shape s = new Square();doStuff(c);doStuff(r);doStuff(s);虚方法的语法规范n必须有virtualvirtual或abstractabstract或overrideoverride所修饰。n虚方法不能省略访问控制符,不能是private的,不能是static的,因为它们应该可以被子类所覆盖。n子类中要覆盖父类的虚方法,必
13、须用overrideoverride。否则认为是新(new)的一个方法,并隐藏了父类的方法,不会实行虚方法调用。n覆盖和被覆盖的方法必须有相同的可访问性和相同的返回类型。虚方法与非虚方法的区别n虚方法调用的方法是由对象实例的类型所决定n非虚方法调用的方法是由所声明的对象变量来决定的。VirtualAndNoneVirtual.cs最可派生的方法n当多次派生,并有virtual与非virtual方法时VirtualComplex.cs4 动态类型确定is运算符n用于判断运行时对象的类型n格式:对象 is 类型n不是nulln可转换,而不异常IsTest.cs= 与 !=n值类型相等n引用类型的相
14、等n是判断是否是同一对象n除非重载了=及!=操作n对于string等类型,已经进行了重载n对于两个boxing的对象,=总是false得到类型信息ntypeof运算符ntypeof(System.Console)n对象.GetType()nType.GetType(string 类名)TypeGetType.csTypeGetMembers.cs反射n反射ReflectionReflectionTest.cs5 对象构造与析构构造方法n构造方法的初始化部分,使用this及basen调用本类或父类的构造方法n不用this且不用base,则会自动认为base() class AA(int a) c
15、lass B : AB(String s ) /编译不能通过ConstructCallThisAndBase.cs域的初始化n域的初始化中不能引用thisn在base被调用之前不能引用 this class B : Aint x = 1;int M() return 1; int y = x+M(); /ErrorB():base(x) /Error构造方法的执行过程 n执行过程n若有this(),转向之n执行域的初始化n转到basen执行方法体n应避免在构造方法中调用任何虚方法 ConstructorExecution.cs静态构造方法n静态构造方法总是在该类的所有静态域初始化之后执行;n静
16、态构造方法总是在该类被使用(如访问静态域、生成实例)之前完成;n静态构造方法最多被执行一次。n静态构造方法的执行顺序的不确定性,所以在使用构造方法时应谨慎 n应尽量避免在静态初始化或静态域中出现循环引用的情况。 nstatic int a=b+1; static int b=a+1;析构方法 n析构方法n类名()n析构方法会自动调用父类的构造方法n注:n编译器生成的构造方法名字为ctor()n生成的析构方法名字为Finalize()n不能显式地调用析构方法自动垃圾回收 n垃圾回收(garbage collection)n自动回收n“强制”回收 System.GC();String a,b;a
17、= String.Copy(hello world);b = String.Copy(game over);Console.WriteLine(a+b+ok);a = null;a = b;return a;显式资源管理n实现IDisposable接口n其中有方法:nvoid Dispose();使用using语句R r1 = new R();try r1.F();finally if (r1 != null) (IDisposable)r1).Dispose();using ( R r1 = new R() )r1.F();小结n类型与转换nas boxingn变量及其传递n按值 out r
18、ef paramsn多态与虚方法调用nabstract, virtual overriden动态类型确定ntypeof is = != 反射n对象构造与析构n构造顺序 IDisposable using 6. csharp语言新特性nC#2.0 引入泛型nC#3.0 引入Lambda及LinqnC#4.0 更多的动态特性dynmaic泛型(Generic)nList books=new List();nBook book = books0;n/以前要用强制类型转换nArrayList books = new ArrayList();nBook book = (Book) books0;常用的泛
19、型的delegatenFuncn多个参数FuncnActionn多个参数ActionnPredicatenComparisonnConverternEventHandler匿名方法ndelegate(参数) 方法体n可以当一个匿名方法nnew Thread(nnew ThreadStart( delegate() . ) );n可以被隐式转换为一个兼容的委托类型nnew Thread(delegate() . );Linqn常见的形式nfrom c in customers nwhere c.Age10norderby c.Namenselect new c.Name, c.Phonen相当于ncustomersn.Where(c= c.Age10)n.OrderBy(c = c.Name).n.Select(c = new c.Name, c.Phone )C#的未来nhttp:/