《C#语言之数据类型》PPT课件.ppt

上传人:tia****nde 文档编号:12707989 上传时间:2020-05-14 格式:PPT 页数:66 大小:541.50KB
返回 下载 相关 举报
《C#语言之数据类型》PPT课件.ppt_第1页
第1页 / 共66页
《C#语言之数据类型》PPT课件.ppt_第2页
第2页 / 共66页
《C#语言之数据类型》PPT课件.ppt_第3页
第3页 / 共66页
点击查看更多>>
资源描述
第二讲C#语言之数据类型之二,3.1值类型3.2引用类型3.3类型转换,第3章C#语言之数据类型,3.2.1类3.2.2接口3.2.3代表3.2.4数组,3.1C#数据类型之引用类型,类,1、类的定义:类是一组具有相同数据结构和相同操作的对象的集合。简单地说:类是对一系列具有相同性质的对象的抽象。,3.2.1类,3.2C#数据类型之引用类型,2、举例:现实中的类,车、人,抽象的概念和继承的概念,特性、方法、事件等概念简介。,类,3.2.1类,3、C中的类:类也是一种数据类型,或称它为类类型。,3.2C#数据类型之引用类型,4、类的构成:类由成员构成,这些成员包括:常数字段方法属性事件索引器运算符实例构造函数析构函数静态构造函数和嵌套类型声明,类,3.2.1类,5、类的声明:书上的例子(p3_6),3.2C#数据类型之引用类型,publicclassContactpublicstringm_name;publicintm_age;publicstringm_telephone;publicstructAddresspublicstringm_city;publicstringm_street;publicintm_number;publicAddressm_address;,类,3.2.1类,3.2C#数据类型之引用类型,classContactpublicstringm_name;publicintm_age;publicstringm_telephone;publicstructAddresspublicstringm_city;publicstringm_street;publicintm_number;publicAddressm_address;,6、类变量及实例化,Contactc1=newContact();,类,3.2.1类,7、类的成员赋值,3.2C#数据类型之引用类型,classContactpublicstringm_name;publicintm_age;publicstringm_telephone;publicstructAddresspublicstringm_city;publicstringm_street;publicintm_number;publicAddressm_address;,classClassSamplepublicstaticvoidMain()Contactc1=newContact();c1.m_name=MikeOwen;c1.m_age=24;c1.m_telephone=Unknown;c1.m_address.m_city=利物浦;c1.m_address.m_street=安菲尔德;c1.m_address.m_number=10;Console.WriteLine(c1.m_address.m_city);Console.WriteLine(c1.m_address.m_street);Console.WriteLine(c1.m_address.m_number);,类,3.2.1类,8、类继承的声明,3.2C#数据类型之引用类型,classContactpublicstringm_name;publicintm_age;publicstringm_telephone;publicstructAddresspublicstringm_city;publicstringm_street;publicintm_number;publicAddressm_address;,classColleague:Contactpublicstringm_Fax;,总结一下:类的继承如何定义,类,3.2.1类,8、类继承的单继承,3.2C#数据类型之引用类型,classContact.classContact1.,classColleague:Contact,Contact1publicstringm_Fax;,错啦?,接口,面向组件的开发-组件编程技术,3.2.2接口,3.2C#数据类型之引用类型,接口,接口,面向组件的开发-组件编程技术,接口,组件与接口:1、接口描述了组件对外提供的服务。2、在组件和组件之间、组件和客户之间都是通过接口进行交互的。,接口,接口的特点:1、组件接口必须是能够自我描述的。这意味着组件接口应该不依赖于具体的实现,将实现和接口分离,彻底消除了接口的使用者和接口的实现者之间的耦合关系,增强了信息的封装程度。同时,这也要求组件接口必须使用一种与组件实现无关的语言。目前组件接口的描述标准是IDL语言。2、尽可能地保持接口不变。由于接口是组件之间的协议,因此组件的接口一旦被发布,组件生产者就应该尽可能地保持接口不变,任何对接口语法或语义上的改变,都有可能造成现有组件与客户之间的联系遭到破坏。3、每个组件都是自主的,有其独特的功能,只能通过接口与外界通信。当一个组件需要提供新的服务时,可以通过增加新的接口来实现,不会影响原接口已存在的客户,而新的客户可以重新选择新的接口来获得服务。,接口,接口的声明:interfaceinterfaceIControlvoidPaint();,usingSystem;interfaceIControlvoidPaint();interfaceITextBox:IControlvoidSetText(stringtext);interfaceIListBox:IControlvoidSetItems(stringitems);interfaceIComboBox:ITextBox,IListBox,总结一下:接口如何定义,接口也有继承?接口的继承如何定义,接口,类继承与接口:,interfaceITelephonevoidDialNumber();interfaceIFax:ITelephonevoidSendFax();voidReceiveFax();classContact:ITelephone.classColleague:Contact,IFax.,谁来总结一下?,接口,类继承与接口:总结:一个正例,classContact:ITelephonepublicvoidDialNumber().classColleague:Contact,IFaxpublicvoidSendFax().publicvoidReceiveFax().,interfaceITelephonevoidDialNumber();interfaceIFax:ITelephonevoidSendFax();voidReceiveFax();,总结!一个正例,代表,1、定义2、为什么引入代表。3、继续保留指针(细致入微的考虑)4、类型安全的代表5、代表相当于一类方法(函数)的指针6、代表的使用:一般步骤及例子分析7、代表的使用步骤进一步的分析8、代表与事件9、真正的例子,代表,1、代表(delegate),也有的书将它翻译成委托,也有的翻译成代理,它才是C#新引进的新概念之一,也是最有特色的最为强大的功能之一。,2、C#引入代表(delegate)就是为了解决C和C+中指针滥用所带来的危害。可以这样说,一个地道的C#程序员,完全可以不用指针就能完成C和C+中使用指针所能完成的任务。,3、当然,若您恋恋不舍指针,甚至没有指针时就不知如何编程,没有关系,C#还是还会忘记您的。,代表,4、与指针不同,代表在C#是类型安全的:强类型,5、代表:与C、C+相比,代表相当于一类方法(函数)的指针,但仍有很大的差别。,C语言中,指向函数的指针:main()intmax(int,int);int(*p)();inta=6,b=7,c=0;p=max;c=(*p)(a,b),代表:相当于一类方法的指针的类型,代表,6、代表的使用分为三个步骤:定义实例化调用,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义:publicdelegateintD1(stringtext);publicdelegatevoidD2();,C语言中,指向函数的指针:main()intmax(int,int);int(*p)();inta=6,b=7,c=0;p=max;c=(*p)(a,b);,仔细注意:它有参数表。,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义:publicdelegateintDelgate1(stringtext);publicdelegatevoidDelgate2();,仔细注意:它有参数表。,语义是什么?,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义:publicdelegateintDelgate1(stringtext);publicdelegatevoidDelgate2();,仔细注意:它有参数表。,代表的实例化:Delgate1d1=newDelgate1(ClassA.DialNumber);Delgate2d2=newDelgate2(ClassB.M1);,呀?代表的实例化?有点怪呀!,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义:publicdelegateintDelgate1(stringtext);publicdelegatevoidDelgate2();,代表的实例化:Delgate1d1=newDelgate1(ClassA.DialNumber);Delgate2d2=newDelgate2(ClassB.M1);,语义:publicClassA()intDialNumber(stringstr),仔细注意:它有参数表。,仔细注意:它有参数表。,语义是什么?,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义:publicdelegateintDelgate1(stringtext);publicdelegatevoidDelgate2();,代表的实例化:Delgate1d1=newDelgate1(ClassA.DialNumber);Delgate2d2=newDelgate2(ClassB.M1);,代表的调用:publicClassA()Delgate1d1=newDelgate1(DialNumber);intx;strings=“abcd”;x=d1(s);,代表的调用,publicdelegatevoidTelDelegate();publicdelegatevoidFaxDelegate(stringText);publicclassDelegateSamplepublicstaticvoidMain()Contactc1=newContact();Colleaguec2=newColleague();TelDelegatetd=newTelDelegate(c1.DialNumber);td();FaxDelegatefd=newFaxDelegate(c2.SendFax);fd(Hello);fd=newFaxDelegate(c2.ReceiveFax);fd(ThisisafaxFromShanghai);,classContact:ITelephonepublicvoidDialNumber().classColleague:Contact,IFaxpublicvoidSendFax(stringtext).publicvoidReceiveFax(stringtext).,代表,8、代表与事件:事件驱动编程,7、代表的使用分为三个步骤:再思考定义实例化调用,谁来定义:程序员?系统?,publicdelegatevoidEventHandler(objectsender,System.EventArgse);publicclassButtonpubliceventEventHandlerClick;publicvoidReset()Click=null;,事件!,代表,8、代表与事件:事件驱动编程,usingSystem;publicclassForm1publicForm1()Button1.Click+=newEventHandler(Button1_Click);ButtonButton1=newButton();voidButton1_Click(objectsender,EventArgse)Console.WriteLine(Button1wasclicked!);publicvoidDisconnect()Button1.Click-=newEventHandler(Button1_Click);,publicdelegatevoidEventHandler(objectsender,System.EventArgse);publicclassButtonpubliceventEventHandlerClick;publicvoidReset()Click=null;,代表,9、真正的代表(delegate)例子(实例方法和表态方法的代理),usingSystem;namespaceMydelegate_Sample1publicdelegateintMyDelegate();/声明一个代表publicclassMyClasspublicintInstanceMethod()Console.WriteLine(调用实例方法。);return5;publicstaticintStaticMethod()Console.WriteLine(调用静态方法。);return0;publicclassTeststaticpublicvoidMain()MyClassp=newMyClass();MyDelegated=newMyDelegate(p.InstanceMethod);d();/调用非静态方法d=newMyDelegate(MyClass.StaticMethod);d();/调用静态方法Console.ReadLine();,代表,10、实验:分析、运行和改进p3_8例子,3.2.4数组,3.2C#数据类型之值类型,C#中的数组,希望大家自学一下,3.2.4数组,3.2C#数据类型之值类型,自学要点提示:,数组是一种什么数据类型:定义、特点、应用与C、C+、JAVA数组的异同点(申明、初始化、引用等)它的基类、主要属性、方法多维数组的特点新概念:不规则数组,也叫锯齿形数组,也叫“交错形数组”,它的特殊作用。不要把交错形数组与多维数组弄混。多维数组是维数大于的数组,而交错形数组是元素是数组的数组。分析P3-10的例子,改进它。,3.2.4数组,3.2C#数据类型之值类型,多维数组,要点:多维数组,intarray1;char,carr;char,carr,cabc;,Object,arr_Obj;Contact,Contacts;,数组的元素类型:值类型,数组的元素类型:Contact是类,3.2.4数组,3.2C#数据类型之值类型,多维数组,要点:多维数组,intarray1;char,carr;char,carr,cabc;,Object,arr_Obj;Contact,Contacts;,秩说明符,维度分隔符,3.2.4数组,3.2C#数据类型之值类型,2、数组初始化,要点:初始化,int,MyArray=newint,1,2,3,4,5,6,7,8;,也可以初始化数组但不指定级别:charMyCharArray=M,y,C,h,a,r,A,r,r,a,y;intMyIntArray=1,2,3,12,45,-1;int,myArray=1,2,3,4,5,6,7,8;,3.2.4数组,3.2C#数据类型之值类型,3、数组元素访问,要点:元素访问,usingSystem;classTeststaticvoidMain()intarr=newint5;for(inti=0;iarr.Length;i+)/通过Length访问数组的元素个数arri=i*i;/数组初绐化,每一个元素的值是其下标值的平方数。for(inti=0;iarr.Length;i+)/遍历Console.WriteLine(arr0=1,i,arri);,3.2.4数组,3.2C#数据类型之值类型,3、数组元素访问,要点:元素访问,usingSystem;classTeststaticvoidMain()intarr=newint5;for(inti=0;iarr.Length;i+)/通过Length访问数组的元素个数arri=i*i;/数组初绐化,每一个元素的值是其下标值的平方数。for(inti=0;iarr.Length;i+)/遍历Console.WriteLine(arr0=1,i,arri);,arr0=0arr1=1arr2=4arr3=9arr4=16,3.2.4数组,3.2C#数据类型之值类型,要点:不规则元素访问,classMultiArraypublicstaticvoidMain()intb=newint3;b0=newint4;b1=newint5;b2=newint4;Console.WriteLine(不规则数组:);Console.WriteLine(b.Length);Console.WriteLine(b.GetLength(0);/调用将会出错:Console.WriteLine(b.GetLength(1);Console.WriteLine(b0.Length);,3.2.4数组,3.2C#数据类型之值类型,publicstaticvoidMain()intb=newint3;b0=newint4;b1=newint5;b2=newint4;Console.WriteLine(不规则数组:);Console.WriteLine(b.Length);Console.WriteLine(b.GetLength(0);/调用将会出错:Console.WriteLine(b.GetLength(1);Console.WriteLine(b0.Length);for(inti=0;ib.Length;i+)Console.WriteLine(bi.Length);,要点:不规则元素访问,3.2.4数组,3.2C#数据类型之值类型,数组是一种什么数据类型:定义、特点、应用与C、C+、JAVA数组的异同点(申明、初始化、引用等)它的基类、主要属性、方法多维数组的特点新概念:不规则数组,也叫锯齿形数组,也叫“交错形数组”,它的特殊作用。不要把交错形数组与多维数组弄混。多维数组是维数大于的数组,而交错形数组是元素是数组的数组。分析P3-10的例子,改进它。,要点:多维数组,类型转换,3.3类型转换,隐式转换,显式转换(强制类型转换),隐式数值转换隐式枚举转换隐式引用转换隐式常量表达式转换转换,显式数值转换显式枚举转换显式引用转换,类型转换,3.3类型转换,3.3.1数值转换3.3.2枚举转换3.3.3引用转换3.3.4装箱和拆箱转换3.3.5转换检查,数值转换,3.3.1数值转换,1、隐式数值转换:,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,inti=10;longX=i;,bytex=16;ushorty=x;y=65535;floatz=y;,数值转换,3.3.1数值转换,1、隐式数值转换:,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,usingSystem;classTestpublicstaticvoidMain()bytex=16;Console.WriteLine(x=0,x);ushorty=x;Console.WriteLine(y=0,y);y=65535;Console.WriteLine(y=0,y);floatz=y;Console.WriteLine(z=0,z);,程序的输出将是:x=16;y=16;y=65535;z=65535;,数值转换,3.3.1数值转换,1、显示式数值转换:,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,inti=10;longl=(long)i;,longl=5000;inti=(int)l;,数值转换,3.3.1数值转换,1、隐式数值转换:特点是从小类型到大类型转换,都会成功,但可能会引起精度下降。,2、显式数值转换:特点是不能保证总是转换成功,可能会发生信息丢失。,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,1、枚举类型的隐式转换,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.2枚举转换,0与枚举类型变量的隐式转换。,枚举转换,0与枚举类型变量的隐式转换。,publicenumWeekdaySunday,Monday=3,Tuesday=5,Wednesday=7classMultiArraypublicstaticvoidMain()Weekdayday=0;Console.WriteLine(day);,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.2枚举转换,运行结果:Sunday,枚举转换,1、0与枚举类型变量的隐式转换。补充:只有一个序号为0,或是默认状态的情况下这一条才成立。,publicenumWeekdaySunday=1,Monday=3,Tuesday=5,Wednesday=7publicclassMultiArraypublicstaticvoidMain()Weekdayday=0;Console.WriteLine(day);,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.2枚举转换,运行结果:0,枚举转换,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.2枚举转换,从sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,或decimal到任何枚举类型;从任何枚举类型到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,或decimal;从任何枚举类型到任何其它枚举类型;,2、显式枚举转换包括以下内容,枚举转换,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.2枚举转换,publicenumWeekdaySunday,Monday,Tuesday,WednesdaypublicclassEnumConversionstaticvoidMain(stringargs)Weekdayday=0;Console.WriteLine(day);day=(Weekday)1;/错误的写法:day=1;Console.WriteLine(day);,枚举转换,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.2枚举转换,枚举转换,publicenumWeekdaySunday,Monday,Tuesday,WednesdaypublicclassEnumConversionstaticvoidMain(stringargs)Weekdayday=0;intx;Console.WriteLine(day);day=(Weekday)1;/错误的写法:day=1;Console.WriteLine(day);day+;Console.WriteLine(day);x=(int)day;Console.WriteLine(x);,SundayMondayTuesday2,引用转换,1、隐式引用转换。,隐式引用转换有如下几个情形:从任何引用类型到对象类型object的转换;从类类型S到类类型T的转换,只要S是T的派生类;从类类型S到接口类型T的转换,只要类S实现了接口T;从接口类型S到接口类型T的转换,其中S是T的中派生的;从元素类型为Ts的数组类型S向元素类型为Tt的数组类型T转换,这种转换需要满足下列条件:S和T只有元素的数据类型不同但它们的维数相同;Ts和Tt都是引用类型存在从Ts到Tt的隐式引用转换;从任何数组类型到System.Array的转换;从任何代表类型到System.Delegate的转换;从任何数组类型或代表类型到System.ICloneable的转换;从空类型null到任何引用类型的转换;,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.3引用转换,2、显式引用转换。,显式引用转换包括:从object到任何引用类型;从类类型S到类类型T,其中S是T的基类;从类类型S到接口类型T,其中S不是密封类,而且没有实现T;从接口类型S到类类型T,其中T不是密封类,而且没有实现S;从接口类型S到接口类型T,其中S不是T的子接口;从元素类型为Ts的数组类型S到元素类型为Tt的数组类型T的转换,这种转换需要满足下列条件:S和T只有元素的数据类型不同,但维数相同;Ts和Tt都是引用类型;存在从Ts到Tt的显式引用转换;从System.Array到数组类型;从System.Delegate到代表类型;从System.ICloneable到数组类型或代表类型;显式引用转换发生在引用类型之间,需要在运行时检测以确保正确。为了确保显式引用转换的正常执行,要求源变量的值必须是null或者它所引用的对象的类型可以被隐式引用转换转换为目标类型。否则显式引用转换失败将抛出一个无效类型转换(InvalidCastException)异常。,3.3类型转换,数值转换枚举转换引用转换装箱和拆箱转换转换检查,3.3.3引用转换,引用转换,值类型与引用类型的转换,3.3.4装箱和拆箱,3.3类型转换,C#语言类型系统提出的两个核心概念,装箱(boxing)拆箱(unboxing),装箱和拆箱,3.3.4装箱和拆箱,装箱和拆箱机制:使得在C#类型系统中任何值类型、引用类型和object对象类型之间进行转换。我们称这种转化为绑定连接。简单地说:有了装箱和拆箱的概念,对任何类型的值来说,最终我们都可以看作是object类型。,3.3类型转换,C#语言类型系统提出的一个核心概念装箱(boxing)和拆箱(unboxing)。,装箱和拆箱,3.3.4装箱和拆箱,publicclassBoxingSamplestaticvoidMain()inti=10;objectobj=i;/Boxingi=20;Console.WriteLine(值类型int:i=0,i);Console.WriteLine(引用类型object:obj=0,obj);,3.3类型转换,值类型int:i=20引用类型object:obj=10,装箱(boxing),装箱和拆箱,3.3.4装箱和拆箱,publicclassBoxingSamplestaticvoidMain()inti=10;objectobj=i;/Boxingi=20;Console.WriteLine(值类型int:i=0,i);Console.WriteLine(引用类型object:obj=0,obj);,3.3类型转换,装箱(boxing),装箱转换是指将一个值类型隐式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(interface-type)。把一个值类型的值装箱就是创建一个object实例,并将这个值复制给这个object。,装箱和拆箱,3.3.4装箱和拆箱,publicclassBoxingSampleclassUnboxingSamplestaticvoidMain()objectobj=10;inti=(int)obj;i=20;Console.WriteLine(引用类型object:obj=0,obj);Console.WriteLine(值类型int:i=0,i);,3.3类型转换,引用类型object:obj=10值类型int:i=20,拆箱(unboxing),装箱和拆箱,3.3.4装箱和拆箱,3.3类型转换,拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。,拆箱(unboxing),publicclassBoxingSampleclassUnboxingSamplestaticvoidMain()objectobj=10;inti=(int)obj;i=20;Console.WriteLine(引用类型object:obj=0,obj);Console.WriteLine(值类型int:i=0,i);,装箱和拆箱,3.3.4装箱和拆箱,3.3类型转换,1、检查这个对象实例,看它是否为给定的值类型的装箱值。2、把这个实例的值拷贝给值类型的变量。,拆箱(unboxing),classUnboxingSamplestaticvoidMain()objectobj=10;inti=(int)obj;i=20;Console.WriteLine(引用类型object:obj=0,obj);Console.WriteLine(值类型int:i=0,i);,拆箱的过程分为两步:,3.3.5用户定义转换,3.3类型转换,用户定义转换,1、用户定义隐式转换,2、用户定义显示转换,3.3.6转换检查,3.3类型转换,转换检查,转换异常的处理,上机习题,3.3类型转换,上机习题,1、运行书上的例子。2、将P3_8按拆分,重新组织,并定义和实现新的代表。3、建立一个不规则的数组,将每一个元素输出。4、实现显式和隐式数值转换,试验溢出的情况5、实现显式和隐式枚举转换,将weekday的所有元素分别按数值、符号输出。6、实现显式和隐式的引用转换,熟悉VS2005环境,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!