《类型的使用优秀PPT.ppt》由会员分享,可在线阅读,更多相关《类型的使用优秀PPT.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、类型的使用类型的使用第一页,本课件共有30页第第6章章 类型的使用类型的使用 nSystem.Object 类的功能类的功能n特殊构造函数特殊构造函数n类型操作类型操作n接口接口n管理外部类型管理外部类型第二页,本课件共有30页System.Object类的功能类的功能n哈希代码哈希代码n对象标识对象标识n对象比较对象比较 n描述类实例的文本字符串描述类实例的文本字符串 6.1 System.Object 类的功能类的功能第三页,本课件共有30页哈希代码哈希代码 n哈希代码被用来支持快速查询哈希代码被用来支持快速查询n重写重写 System.Object的的GetHashCode方法时方法时l
2、必须为有相同值的对象返回相同的哈希代码l必须用高效率的方法来实现6.1.1 哈希代码哈希代码 struct Student string name;int ID;/每个实例是惟一的 public override int GetHashCode()return ID;第四页,本课件共有30页 哈希代码哈希代码(续)(续)n在选择生成哈希代码算法时遵循的一些指导性原在选择生成哈希代码算法时遵循的一些指导性原则则l使用高效的随机分配算法l算法中可以调用基类的 GetHashCode 方法,但不要调用Object 和 ValueType 类的 GetHashCode 方法l算法中至少要用到一个成员字
3、段l理想情况下,算法中用到的字段是不可变的l让算法尽可能的快l有相同值的对象要返回相同的哈希代码6.1.1 哈希代码哈希代码 第五页,本课件共有30页对象标识对象标识n每个对象都有一个独一无二的标识每个对象都有一个独一无二的标识n和和VC+中用内存地址来决定对象的标识类似中用内存地址来决定对象的标识类似n用用Object.ReferenceEquals方法来测试两个引用是否方法来测试两个引用是否指向同一个对象,就是说,是否有相同的标识指向同一个对象,就是说,是否有相同的标识6.1.2 对象标识对象标识第六页,本课件共有30页对象比较对象比较 n比较两个对象来确定他们是否相等比较两个对象来确定他
4、们是否相等n重写重写Equals方法方法n提供提供=和和!=运算符运算符n指导原则指导原则l如果要重写Equals方法,则必须重写 GetHashCode 方法l如果要重载=,用相同的算法重写 Equals方法 l如果要实现 Icomparable 接口,则必须要实现Equals方法l保证 Equals 和 GetHashCode 方法不抛出异常6.1.3 对象比较对象比较第七页,本课件共有30页描述类实例的文本字符串描述类实例的文本字符串n重写重写ToString方法来自定义对象的可读字符串内容方法来自定义对象的可读字符串内容n用用IFormattabl 接口和接口和format方法来实现本
5、地化字符方法来实现本地化字符串串6.1.4 描述类实例的文本字符串描述类实例的文本字符串struct President public string FirstName;public string LastName;public override string ToString()return FirstName+LastName;第八页,本课件共有30页第第6章章 类型的使用类型的使用 nSystem.Object 类的功能类的功能n特殊构造函数特殊构造函数n类型操作类型操作n接口接口n管理管理外部类型外部类型第九页,本课件共有30页特殊构造函数特殊构造函数n静态构造函数静态构造函数n私有构
6、造函数私有构造函数6.2 特殊构造函数特殊构造函数第十页,本课件共有30页静态构造函数静态构造函数n被用来初始化静态成员被用来初始化静态成员n在中间语言中名字为在中间语言中名字为.cctor6.2.1 静态构造函数静态构造函数class DeviceConnection public static uint ConnectionCount;public void OpenConnection(string connectionName)ConnectionCount+;/其他打开设备工作 static DeviceConnection()/初始化静态成员变量ConnectionCount=0;
7、第十一页,本课件共有30页静态构造函数(续)静态构造函数(续)n静态构造函数没有类似静态构造函数没有类似“private”或者或者“public”的修饰符的修饰符n它只能用来初始化静态变量,而不能用来初始化它只能用来初始化静态变量,而不能用来初始化实例变量实例变量n当内联地初始化静态成员变量时当内联地初始化静态成员变量时l当类没有提供显式的静态构造函数时,静态构造函数被隐式创建,并在其内初始化静态变量l当类显式提供了静态构造函数时,则内联地初始化被编译到显示构造函数中去,并且首先被执行6.2.1 静态构造函数静态构造函数第十二页,本课件共有30页私有构造函数私有构造函数n用来防止类被实例化用来
8、防止类被实例化n用来实现所有成员都是静态的类用来实现所有成员都是静态的类n用用protected构造函数来使所有成员都是静态构造函数来使所有成员都是静态的类可以被继承的类可以被继承6.2.2 私有构造函数私有构造函数class Trig public static double Sin(double x)/计算和返回 sin(x)public static double Cos(double x)/计算和返回 cos(x)public static double Tan(double x)/计算和返回 tan(x)private Trig()第十三页,本课件共有30页第第6章章 类型的使用类型
9、的使用 nSystem.Object 类的功能类的功能n特殊构造函数特殊构造函数n类型操作类型操作n接口接口n管理管理外部类型外部类型第十四页,本课件共有30页类型操作类型操作n类型转换类型转换n强制转换强制转换n装箱装箱6.3 类型操作类型操作第十五页,本课件共有30页类型转换类型转换n当一种类型的值被赋给另一种类型的变量时发生类当一种类型的值被赋给另一种类型的变量时发生类型转换型转换n显式类型转换显式类型转换n显式类型转换不会发生编译时错误,但有可能发生显式类型转换不会发生编译时错误,但有可能发生运行时异常运行时异常n收缩类型转换必须是显式的收缩类型转换必须是显式的6.3.1 类型转换类型
10、转换int x=5;double y=(double)x;第十六页,本课件共有30页类型转换(续)类型转换(续)n隐式类型转换隐式类型转换n转换操作符转换操作符6.3.1 类型转换类型转换 int x=5;double y=x;public static implicit operator byte(Digit d)public static explicit operator Digit(byte b)第十七页,本课件共有30页强制转换强制转换n从派生类到基类的转换从派生类到基类的转换n从基类到派生类的转换从基类到派生类的转换6.3.2 强制转换强制转换Square sq=new Squar
11、e();Shape sh=sq;Square sq2=(Square)sh;/向下转换到 Square类型sh=new Shape();sq2=(Square)sh;/无效类型转换异常第十八页,本课件共有30页强制转换(续)强制转换(续)n用用Is和和TypeOf操作符进行对象类型检查操作符进行对象类型检查n转换接口转换接口6.3.2 强制转换强制转换Shape sh=new Shape();Square sq;if(sh is Square)sq=(Square)sh;ICDPlayer player;Device d=new Device();player=(ICDPlayer)d;/转换
12、到接口player.Play();第十九页,本课件共有30页装箱装箱n把值类型转换成引用类型时发生装箱把值类型转换成引用类型时发生装箱lSystem.Object的实例被分配在堆上l值类型被拷贝到新的对象n取消装箱发生在从取消装箱发生在从Object对象中把值类型重新取回来对象中把值类型重新取回来时时n在循环中发生装箱和取消装箱操作的代价是很高的在循环中发生装箱和取消装箱操作的代价是很高的6.3.3 装箱装箱int x=5;/值类型Object o=x;/被装箱Console.WriteLine(“The answer is:0”,x);/被装箱int y=(int)o;/取消装箱第二十页,本
13、课件共有30页第第6章章 类型的使用类型的使用 nSystem.Object类的功能类的功能n特殊构造函数特殊构造函数n类型操作类型操作n接口接口n管理管理外部类型外部类型第二十一页,本课件共有30页接口接口n继承需考虑的事项继承需考虑的事项 n显式接口的实现显式接口的实现6.4 接口接口第二十二页,本课件共有30页继承需考虑的事项继承需考虑的事项 n继承多个接口继承多个接口n从多个接口继承生成新的接口从多个接口继承生成新的接口n实现接口的基类实现接口的基类l当一个派生类的实例被转化为接口时,则该接口的方法调用发生在实现该接口的类上6.4.1 继承需考虑的事项继承需考虑的事项interface
14、 IFoo void DoSomething1();interface IBar void DoSomething2();class MyObject:IFoo,IBar.interface INewInterface:IFoo,IBar void DoSomething3();第二十三页,本课件共有30页显式接口的实现显式接口的实现n类和接口的可访问性对比类和接口的可访问性对比n用显示接口实现用显示接口实现l当接口和实现类的成员实现名称会被混淆时l当继承自有重名的多个接口时6.4.2 显式接口的实现显式接口的实现interface IFoo void DoSomething();interf
15、ace IBar void DoSomething();class MyObject:IFoo,IBar void IFoo.DoSomething()Console.WriteLine(IFoo DoSomething called);void IBar.DoSomething()Console.WriteLine(IBar DoSomething called);第二十四页,本课件共有30页第第6章章 类型类型nSystem.Object 类的功能类的功能n特殊构造函数特殊构造函数n类型操作类型操作n接口接口n管理管理外部类型外部类型第二十五页,本课件共有30页管理外部类型管理外部类型n平
16、台调用服务平台调用服务nCOM互操作性互操作性 6.5 管理外部类型管理外部类型 第二十六页,本课件共有30页平台调用服务平台调用服务n也叫做也叫做PInvoken用用DllImport属性从外部属性从外部DLL中导入中导入API函数函数6.5.1 平台调用服务平台调用服务 DllImport(user32.dll,CharSet=CharSet.Ansi)public static extern int MessageBox(int h,string m,string c,int type);public static void Main()string pText=Hello World!
17、;string pCaption=PInvoke Test;MessageBox(0,pText,pCaption,0);第二十七页,本课件共有30页COM互操作性互操作性 n使使.NET Framework类库对类库对COM可用可用l必须创建COM可调用包(CCW)l用Tlbexp.exe创建CCWsl用Regasm.exe来注册组件n使使COM类库对类库对.NET Framework可用可用l必须创建运行时可调用包(RCW)l用Tlbimp.exe创建RCWs6.5.2 COM互操作性互操作性第二十八页,本课件共有30页实验实验 类型的使用类型的使用练习练习1重写重写System.Object方法方法练习练习2 实现显式接口实现显式接口 第二十九页,本课件共有30页回顾回顾学习完本章后,将能够:学习完本章后,将能够:n解释解释System.Object类提供的功能类提供的功能n创建和使用接口来定义方法和属性创建和使用接口来定义方法和属性n解释装箱和取消装箱操作解释装箱和取消装箱操作n使用运算符运行时发现类型,并进行转换使用运算符运行时发现类型,并进行转换n解释解释.NET Framework提供了哪些服务来和非托管代码提供了哪些服务来和非托管代码互操作互操作第三十页,本课件共有30页