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