C#语言之数据类型2.ppt_第1页
C#语言之数据类型2.ppt_第2页
C#语言之数据类型2.ppt_第3页
C#语言之数据类型2.ppt_第4页
C#语言之数据类型2.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二讲 C#语言之数据类型之二,3.1 值类型 3.2 引用类型 3.3 类型转换,第3章 C#语言之数据类型,3.2.1 类 3.2.2 接口 3.2.3 代表 3.2.4 数组,3.1 C#数据类型之引用类型,类,1、类的定义: 类是一组具有相同数据结构和相同操作的对象的集合。 简单地说:类是对一系列具有相同性质的对象的抽象。,3.2.1 类,3.2 C#数据类型之引用类型,2、举例: 现实中的类,车、人,抽象的概念和继承的概念,特性、方法、事件等概念简介。,类,3.2.1 类,3、C中的类: 类也是一种数据类型,或称它为类类型 。,3.2 C#数据类型之引用类型,4、类的构成: 类由成员构成,这些成员包括: 常数 字段 方法 属性 事件 索引器 运算符 实例构造函数 析构函数 静态构造函数和 嵌套类型声明,类,3.2.1 类,5、类的声明: 书上的例子(p3_6),3.2 C#数据类型之引用类型,public class Contact public string m_name; public int m_age; public string m_telephone; public struct Address public string m_city; public string m_street; public int m_number; public Address m_address; ,类,3.2.1 类,3.2 C#数据类型之引用类型,class Contact public string m_name; public int m_age; public string m_telephone; public struct Address public string m_city; public string m_street; public int m_number; public Address m_address; ,6、类变量及实例化,Contact c1 = new Contact();,类,3.2.1 类,7、类的成员赋值,3.2 C#数据类型之引用类型,class Contact public string m_name; public int m_age; public string m_telephone; public struct Address public string m_city; public string m_street; public int m_number; public Address m_address; ,class ClassSample public static void Main() Contact c1 = new Contact(); c1.m_name = “Mike Owen“; 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.2 C#数据类型之引用类型,class Contact public string m_name; public int m_age; public string m_telephone; public struct Address public string m_city; public string m_street; public int m_number; public Address m_address; ,class Colleague : Contact public string m_Fax; ,总结一下: 类的继承如何定义,类,3.2.1 类,8、类继承的单继承,3.2 C#数据类型之引用类型,class Contact class Contact1 ,class Colleague : Contact, Contact1 public string m_Fax; ,错啦?,接口,面向组件的开发-组件编程技术,3.2.2 接口,3.2 C#数据类型之引用类型,接口,接口,面向组件的开发-组件编程技术,接口,组件与接口: 1、接口描述了组件对外提供的服务。 2、在组件和组件之间、组件和客户之间都是通过接口进行交互的。,接口,接口的特点: 1、组件接口必须是能够自我描述的。 这意味着组件接口应该不依赖于具体的实现,将实现和接口分离,彻底消除了接口的使用者和接口的实现者之间的耦合关系,增强了信息的封装程度。 同时,这也要求组件接口必须使用一种与组件实现无关的语言。目前组件接口的描述标准是IDL语言。 2、尽可能地保持接口不变。 由于接口是组件之间的协议,因此组件的接口一旦被发布,组件生产者就应该尽可能地保持接口不变,任何对接口语法或语义上的改变,都有可能造成现有组件与客户之间的联系遭到破坏。 3、每个组件都是自主的,有其独特的功能,只能通过接口与外界通信。 当一个组件需要提供新的服务时,可以通过增加新的接口来实现,不会影响原接口已存在的客户,而新的客户可以重新选择新的接口来获得服务。,接口,接口的声明:interface interface IControl void Paint(); ,using System; interface IControl void Paint(); interface ITextBox: IControl void SetText(string text); interface IListBox: IControl void SetItems(string items); interface IComboBox: ITextBox, IListBox ,总结一下: 接口如何定义, 接口也有继承? 接口的继承如何定义,接口,类继承与接口:,interface ITelephone void DialNumber(); interface IFax : ITelephone void SendFax(); void ReceiveFax(); class Contact : ITelephone class Colleague : Contact, IFax ,谁来总结一下?,接口,类继承与接口:总结:一个正例,class Contact : ITelephone public void DialNumber() . . class Colleague : Contact, IFax public void SendFax() . public void ReceiveFax() . ,interface ITelephone void DialNumber(); interface IFax : ITelephone void SendFax(); void ReceiveFax(); ,总结! 一个正例,代表,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() int max(int,int); int (*p)(); int a = 6, b = 7, c = 0; p = max; c = (*p)(a,b) ,代表: 相当于一类方法的指针 的类型,代表,6、代表的使用分为三个步骤: 定义 实例化 调用,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义: public delegate int D1(string text); public delegate void D2();,C语言中,指向函数的指针: main() int max(int,int); int (*p)(); int a = 6, b = 7, c = 0; p = max; c = (*p)(a,b); ,仔细注意: 它有参数表。,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义: public delegate int Delgate1(string text); public delegate void Delgate2();,仔细注意: 它有参数表。,语义是什么?,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义: public delegate int Delgate1(string text); public delegate void Delgate2();,仔细注意: 它有参数表。,代表的实例化: Delgate1 d1 = new Delgate1(ClassA.DialNumber); Delgate2 d2 = new Delgate2(ClassB.M1);,呀?代表的实例化? 有点怪呀!,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义: public delegate int Delgate1(string text); public delegate void Delgate2();,代表的实例化: Delgate1 d1 = new Delgate1(ClassA.DialNumber); Delgate2 d2 = new Delgate2(ClassB.M1);,语义: public ClassA() int DialNumber(string str) ,仔细注意: 它有参数表。,仔细注意: 它有参数表。,语义是什么?,代表,6、代表的使用分为三个步骤:定义、实例化、调用,代表的定义: public delegate int Delgate1(string text); public delegate void Delgate2();,代表的实例化: Delgate1 d1 = new Delgate1(ClassA.DialNumber); Delgate2 d2 = new Delgate2(ClassB.M1);,代表的调用: public ClassA() Delgate1 d1 = new Delgate1(DialNumber); int x; string s=“abcd”; x = d1(s); ,代表的调用,public delegate void TelDelegate(); public delegate void FaxDelegate(string Text); public class DelegateSample public static void Main() Contact c1 = new Contact(); Colleague c2 = new Colleague(); TelDelegate td = new TelDelegate(c1.DialNumber); td(); FaxDelegate fd = new FaxDelegate(c2.SendFax); fd(“Hello“); fd = new FaxDelegate(c2.ReceiveFax); fd(“This is a fax From Shanghai“); ,class Contact : ITelephone public void DialNumber() . class Colleague : Contact, IFax public void SendFax(string text) . public void ReceiveFax(string text) . ,代表,8、代表与事件:事件驱动编程,7、代表的使用分为三个步骤:再思考 定义 实例化 调用,谁来定义: 程序员? 系统?,public delegate void EventHandler(object sender, System.EventArgs e); public class Button public event EventHandler Click; public void Reset() Click = null; ,事件!,代表,8、代表与事件:事件驱动编程,using System; public class Form1 public Form1() Button1.Click += new EventHandler(Button1_Click); Button Button1 = new Button(); void Button1_Click(object sender, EventArgs e) Console.WriteLine(“Button1 was clicked!“); public void Disconnect() Button1.Click -= new EventHandler(Button1_Click); ,public delegate void EventHandler(object sender, System.EventArgs e); public class Button public event EventHandler Click; public void Reset() Click = null; ,代表,9、真正的代表(delegate)例子(实例方法和表态方法的代理),using System; namespace Mydelegate_Sample1 public delegate int MyDelegate(); /声明一个代表 public class MyClass public int InstanceMethod() Console.WriteLine(“调用实例方法。“); return 5; public static int StaticMethod() Console.WriteLine(“调用静态方法。“); return 0; public class Test static public void Main() MyClass p = new MyClass(); MyDelegate d = new MyDelegate(p.InstanceMethod); d(); / 调用非静态方法 d = new MyDelegate(MyClass.StaticMethod); d(); / 调用静态方法 Console.ReadLine(); ,代表,10、实验:分析、运行和改进p3_8例子,3.2.4 数组,3.2 C#数据类型之值类型,C#中的数组,希望大家自学一下,3.2.4 数组,3.2 C#数据类型之值类型,自学要点提示:,数组是一种什么数据类型:定义、特点、应用 与C、C+、JAVA数组的异同点(申明、初始化、引用等) 它的基类、主要属性、方法 多维数组的特点 新概念:不规则数组,也叫锯齿形数组,也叫“交错形数组”,它的特殊作用。不要把交错形数组与多维数组弄混。多维数组是维数大于的数组,而交错形数组是元素是数组的数组 。 分析P3-10的例子,改进它。,3.2.4 数组,3.2 C#数据类型之值类型,多维数组,要点:多维数组,int array1; char, carr; char, carr,cabc;,Object, arr_Obj; Contact, Contacts;,数组的元素类型 : 值类型,数组的元素类型 : Contact 是类,3.2.4 数组,3.2 C#数据类型之值类型,多维数组,要点:多维数组,int array1; char, carr; char, carr,cabc;,Object, arr_Obj; Contact, Contacts;,秩说明符,维度分隔符,3.2.4 数组,3.2 C#数据类型之值类型,2、数组初始化,要点:初始化,int, MyArray = new int, 1,2, 3,4, 5,6, 7,8;,也可以初始化数组但不指定级别: char MyCharArray=M,y,C,h,a,r,A,r,r,a,y; int MyIntArray = 1,2,3,12,45,-1; int, myArray = 1,2, 3,4, 5,6, 7,8;,3.2.4 数组,3.2 C#数据类型之值类型,3、数组元素访问,要点:元素访问,using System; class Test static void Main() int arr = new int5; for (int i = 0; i arr.Length; i+)/通过Length访问数组的元素个数 arri = i * i;/数组初绐化,每一个元素的值是其下标值的平方数。 for (int i = 0; i arr.Length; i+)/遍历 Console.WriteLine(“arr0 = 1“, i, arri); ,3.2.4 数组,3.2 C#数据类型之值类型,3、数组元素访问,要点:元素访问,using System; class Test static void Main() int arr = new int5; for (int i = 0; i arr.Length; i+)/通过Length访问数组的元素个数 arri = i * i;/数组初绐化,每一个元素的值是其下标值的平方数。 for (int i = 0; i arr.Length; i+)/遍历 Console.WriteLine(“arr0 = 1“, i, arri); ,arr0 = 0 arr1 = 1 arr2 = 4 arr3 = 9 arr4 = 16,3.2.4 数组,3.2 C#数据类型之值类型,要点: 不规则元素访问,class MultiArray public static void Main() int b = new int3; b0 = new int4; b1 = new int5; b2 = new int4; Console.WriteLine(“不规则数组:“); Console.WriteLine(b.Length); Console.WriteLine(b.GetLength(0); /调用将会出错:Console.WriteLine(b.GetLength(1); Console.WriteLine(b0.Length); ,3.2.4 数组,3.2 C#数据类型之值类型,public static void Main() int b = new int3; b0 = new int4; b1 = new int5; b2 = new int4; Console.WriteLine(“不规则数组:“); Console.WriteLine(b.Length); Console.WriteLine(b.GetLength(0); /调用将会出错:Console.WriteLine(b.GetLength(1); Console.WriteLine(b0.Length); for (int i = 0; i b.Length; i+) Console.WriteLine(bi.Length); ,要点: 不规则元素访问,3.2.4 数组,3.2 C#数据类型之值类型,数组是一种什么数据类型:定义、特点、应用 与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 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,int i = 10; long X = i;,byte x = 16; ushort y = x; y = 65535; float z = y;,数值转换,3.3.1 数值转换,1、隐式数值转换:,3.3 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,using System; class Test public static void Main() byte x = 16; Console.WriteLine(“x = 0“,x); ushort y = x; Console.WriteLine(“y = 0“,y); y = 65535; Console.WriteLine(“y = 0“,y); float z = y; Console.WriteLine(“z = 0“,z); ,程序的输出将是: x = 16; y = 16; y = 65535; z = 65535;,数值转换,3.3.1 数值转换,1、显示式数值转换:,3.3 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,int i = 10; long l = (long)i;,long l = 5000; int i = (int) l;,数值转换,3.3.1 数值转换,1、隐式数值转换:特点是从小类型到大类型转换,都会成功,但可能会引起精度下降。,2、显式数值转换:特点是不能保证总是转换成功,可能会发生信息丢失。,3.3 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,1、枚举类型的隐式转换,3.3 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,3.3.2 枚举转换,0与枚举类型变量的隐式转换。,枚举转换,0与枚举类型变量的隐式转换。,public enum Weekday Sunday , Monday = 3, Tuesday = 5, Wednesday = 7 class MultiArray public static void Main() Weekday day = 0; Console.WriteLine(day); ,3.3 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,3.3.2 枚举转换,运行结果: Sunday,枚举转换,1、0与枚举类型变量的隐式转换。补充:只有一个序号为0,或是默认状态的情况下这一条才成立。,public enum Weekday Sunday=1 , Monday = 3, Tuesday = 5, Wednesday = 7 public class MultiArray public static void Main() Weekday day = 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 枚举转换,public enum Weekday Sunday , Monday, Tuesday, Wednesday public class EnumConversion static void Main(string args) Weekday day = 0; Console.WriteLine(day); day = (Weekday)1; /错误的写法: day = 1; Console.WriteLine(day); ,枚举转换,3.3 类型转换,数值转换 枚举转换 引用转换 装箱和拆箱转换 转换检查,3.3.2 枚举转换,枚举转换,public enum Weekday Sunday , Monday, Tuesday, Wednesday public class EnumConversion static void Main(string args) Weekday day = 0; int x; Console.WriteLine(day); day = (Weekday)1; /错误的写法: day = 1; Console.WriteLine(day); day+; Console.WriteLine(day); x = (int)day; Console.WriteLine(x); ,Sunday Monday Tuesday 2,引用转换,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 装箱和拆箱,public class BoxingSample static void Main() int i = 10; object obj = i; /Boxing i = 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 装箱和拆箱,public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论