第 04 章C#面向对象编程进阶课件_第1页
第 04 章C#面向对象编程进阶课件_第2页
第 04 章C#面向对象编程进阶课件_第3页
第 04 章C#面向对象编程进阶课件_第4页
第 04 章C#面向对象编程进阶课件_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、C#C#教程教程4.1 4.1 委托和事件委托和事件4.2 4.2 接口接口4.3 4.3 集合类集合类4.4 String4.4 String类与类与StringBuilderStringBuilder类类4.5 4.5 命名空间和局部类命名空间和局部类4.6 4.6 泛型泛型4.7 4.7 综合应用综合应用C#C#教程教程4.1.1 4.1.1 委托委托定义委托使用关键字delegate:delegate int SomeDelegate(int nID, string sName);再实例化:SomeDelegate d1 = new SomeDelegate(wr.InstanceMe

2、thod);其中wr是对象,有InstanceMethod实例方法。最后调用:d1(5, aaa);通过委托SomeDelegate实现对方法InstanceMethod的调用,调用还必须有一个前提条件:方法InstanceMethod有参数且和定义SomeDelegate的参数一致,并且返回值为int。方法InstanceMethod的定义: public int InstanceMethod(int nID, string sName)C#C#教程教程例例EX4_1EX4_1】设计一个管理企业员工上下班的设计一个管理企业员工上下班的WinFormWinForm程序。员工单击程序。员工单击“

3、上班上班”按钮表示签到上班,单击按钮表示签到上班,单击“下班下班”按钮表示下班按钮表示下班。定义一个管理上下班类“StartOffWork”,其中“StartWork”和“OffWork”方法分别管理上班和下班。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm项目并命名为“EX4_1”,从工具箱中拖曳2个“Label”和2“Button”控件到窗体上。(2)设置控件与窗体属性将Form1、button1和button2的“Text”属性分别设置为“委托”、“上班”和“下班”,label1和label2的“Text”属性都设置为空值。C#C#教程教程(3)添加代码在窗体设计

4、器中分别双击button1和button2按钮,在代码编辑窗口中添加代码,代码如下所示。(4)运行程序按“Ctrl+F5”组合键运行程序,单击“上班”按钮,结果如图4.1所示。如果单击“下班”按钮,则弹出对话框,如图4.2所示。 图4.1 单击“上班”按钮的结果 图4.2 消息框C#C#教程教程说明:说明:(1)类“MessageBox”是显示可包含文本、按钮和符号(通知并指示用户)的消息框的。其中显示消息框的“Show”方法有很多重载方法。例如,代码“MessageBox.Show(确实要关闭系统吗,系统提示,MessageBoxButtons.YesNo);”将弹出如图4.3所示的消息框。

5、在后面章节将详细介绍消息框。 图4.3 消息框C#C#教程教程(2)匿名方法。创建匿名方法为:首先创建一个委托:delegate void Dele(string s);然后实例化委托,指定该委托要执行的代码块:Dele d=delegate(string str)/*ToDo*/;如在示例代码中,将“下班”按钮事件代码改为匿名方法为:private void button2_Click(object sender, EventArgs e)/单击“下班”按钮执行的动作 OffWorkDelegate OWork = delegate(string offworktime) if (DateT

6、ime.Now Convert.ToDateTime(offworktime) /是否到了下班时间 MessageBox.Show(辛苦了!); /弹出消息框 else MessageBox.Show(还没到下班时间!); ; OWork(17:30); (3)DateTime用于表示日期和时间,同时也包含许多检索、操作和格式化日期和时间值的函数。C#C#教程教程C#事件是按“发布-预订”方式工作的。先在一个类中发布事件,然后在任意数量的类中对事件进行预订。事件的工作过程如图4.4所示。图4.4 事件的工作过程C#C#教程教程C#事件机制是基于委托实现的,因此首先要定义一个委托EventHan

7、dler: public delegate void EventHandler(object sender , myEventArgs e)其中: myEventArgs类:派生于EventArgs类(包含事件数据的类的基类),实现自定义事件数据的功能。 sender:表示发生事件的对象。定义事件格式为:event 事件的委托名 事件名如事件TextOut定义:public event EventHandler TextOut;事件的激活一般写成:if (TextOut != null) TextOut(this,new EventArgs();C#C#教程教程检查TextOut事件有没有被订

8、阅,如果不为null,则表示有用户订阅。订阅事件的是事件确发类,首先实例化EventSource,然后再订阅事件:evsrc.TextOut += new EventSource.EventHandler(CatchEvent);/evsrc是事件确发类对象也可以取消订阅:evsrc.TextOut = new EventSource.EventHandler(CatchEvent);C#C#教程教程【例例EX4_2EX4_2】利用事件设计一个简单的颜色代码,查询利用事件设计一个简单的颜色代码,查询WinFormWinForm应用应用程序。程序。设计思路如下:在这里定义3个类,事件确发类“Co

9、lorEvent”引发事件,事件处理类“Color Recognize”显示颜色代码消息,派生于EventArgs类的“ColorEventArgs”类提供事件数据。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm项目并命名为“EX4_2”,从工具箱中拖曳1个“TextBox”和1个“Button”控件到窗体中。 (2)设置控件与窗体属性将button1和Form1的“Text”属性设置为“查询”和“事件”。(3)添加代码在窗体设计器中双击button1,添加代码。代码如下所示。C#C#教程教程(4)运行程序按“Ctrl+F5”组合键运行程序,输入一种颜色,单击“查询”按

10、钮,结果如图4.5所示。 图4.5 查询颜色的代码C#C#教程教程接口是用来定义一种程序的协定。接口好比一种模板,这种模板定义了实现接口的对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口的定义如下:public interface IPartAvoid SetDataA(string dataA);与类的继承类似,接口的继承也形成接口之间的层次结构。例如:using System;interface IControlvoid Paint();interface ITextBox : IControlvoid SetText(string text);interface Il

11、istBox : IControlvoid SetItems(string items);interface IComboBox : ITextBox, IlistBox C#C#教程教程【例例EX4_3EX4_3】设计一个简单的计算器。其中定义一个类设计一个简单的计算器。其中定义一个类“CalculateCalculate”和一个接口和一个接口“ICalculateAICalculateA”,用于计算的类,用于计算的类“CalculateCalculate”继承接口继承接口“ICalculateAICalculateA”。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm

12、项目并命名为“EX4_3”,在Form1中添加3个“TextBox”、1个“Button”和1个“Label”控件。(2)设置属性将button1和Form1的“Text”属性分别设置为“=”和“接口”。(3)添加代码在窗体设计器中双击“=”按钮,添加代码,代码如下所示。C#C#教程教程(4)运行程序按“Ctrl+F5”组合键运行程序,输入数据和运算符,单击“=”按钮,结果如图4.6所示。图4.6 例EX4_3运行的结果C#C#教程教程4.3.1 Array4.3.1 Array类类1 1Array.Sort()Array.Sort()方法与方法与Array.Reverse()Array.Re

13、verse()方法方法Array.Sort()方法可以实现对一维数组的排序。常用的几种形式及说明如表4.1所示。形 式说 明Array.Sort (Array)使用 Array 数组中每个元素的 Icomparable接口实现,对整个一维 Array数组元素排序Array.Sort(Array,Array)基于第一个Array数组中的关键字,使用每个关键字的 Icomparable接口实现,对两个一维 Array数组对象排序Array.Sort(Array, IComparer)使用指定的 Icomparer接口,对一维Array数组元素排序Array.Sort(Array,Array,ICo

14、mparer)基于第一个Array数组中的关键字,使用指定的 Icomparer接口,对两个一维 Array数组对象排序表4.1 Array.Sort()方法常用的几种形式及说明Array.Reverse()方法可以用来对整个数组的顺序进行反转,其形式如下: public static void Reverse(Arrary); C#C#教程教程2 2Array.BinarySearch()Array.BinarySearch()方法方法Array.BinarySearch()方法实现在已经排序的一维数组中查找元素,常用的几种形式及说明如表4.2所示。形 式说 明Array.BinarySea

15、rch(Array, Object)使用由Array数组中每个元素和指定的对象实现的IComparable接口,在整个一维排序Array数组中搜索特定元素Array.BinarySearch(Array,Object, IComparer)使用指定的IComparer接口,在整个一维排序Array数组中搜索值表4.2 Array. BinarySearch()方法常用的几种形式及说明C#C#教程教程【例例EX4_4EX4_4】设计一个对所输入的数组进行排序与查找的设计一个对所输入的数组进行排序与查找的WinFormWinForm应应用程序。用程序。设计思路如下:定义一个类“CSort”,在此类

16、中定义数组的排序和查找方法,其中在各个方法中调用对应的Array的方法完成数组的排序与查找功能。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm项目并命名为“EX4_4”,在Form1中添加4个“TextBox”、2个“Button”和4个“Label”控件。(2)设置属性将Form1、label1、label2、label3、label4、button1和button2的“Text”属性分别设置为“数组的排序与查找”、“输入数组:”、“正向排序:”、“反转数组:”、“查找位置:”、“确定”和“清空”。C#C#教程教程(3)添加事件代码在窗体编辑器中分别双击button1

17、和button2,系统自动切换到代码编辑窗口,添加代码,代码如下所示。(4)运行程序按“Ctrl+F5”组合键运行程序,输入数据,如图4.7所示,单击“确定”按钮,结果如图4.8所示。 图4.7 输入数据 图4.8 排序和查找的结果C#C#教程教程堆栈是一种后进先出(LIFO)的数据结构。就像在货物管理中,有一些实时性非常强的货物,需要后入仓先出仓,如图4.9所示。图4.9 后进先出C#C#教程教程Stack堆栈类表示对象的“后进先出”集合。为了创建Stack类的实例,需要调用Stack类提供的构造函数。Stack类的构造函数提供了三种重载形式,所以有三种实例化方法,如下所示:Stack sa

18、ck1 = new Stack();/使用默认容量实例化Stack sack2 = new Stack(new string5 堆栈元素1, 堆栈元素2, 堆栈元素3, 堆栈元素4, 堆栈元素5 );/由string数组中的集合元素初始化堆栈对象Stack sack3 = new Stack(20); /创建堆栈对象并指定20个元素C#C#教程教程Stack类的常用方法及说明如表4.3所示。Stack类将它的对象存储在数组中。只要数组足够大到可以存储新的对象,调用Push方法就是非常有效的。方 法说 明Clear从 Stack中移除所有对象Pop移除并返回位于Stack 顶部的对象Push将对

19、象插入Stack 的顶部Peek返回位于Stack 顶部的对象但不将其移除表4.3 Stack类的常用方法及说明C#C#教程教程【例例EX4_5EX4_5】利用利用StackStack设计一个备忘录。设计一个备忘录。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm项目并命名为“EX4_5”,在Form1中添加2个“TextBox”、2个“GroupBox”、1个“Label”和3个“Button”控件。(2)设置属性将button1、button2、button3、groupBox1、groupBox2、Form1和label1的“Text”属性分别设置为“”、“”、“”

20、、“填写备忘录”、“所有备忘录”、“备忘录”和“共有0条备忘录”。将textBox1与textBox2的Multiline和ScrollBars属性值设置为“True”和“Both”。其中3个Button控件用于添加、修改和删除备忘录。(3)添加事件代码在窗体设计器中分别双击3个Button控件和窗体。因为类“Stack”在“System.Collections”命名空间中,所以添加命名空间“using System.Collections;”,添加代码,代码如下所示。C#C#教程教程(4)运行程序按“Ctrl+F5”组合键运行程序,填写重要事件的日期和重要的事件,单击“ ”按钮添加备忘录。如

21、果要修改,可单击“ ”按钮修改。单击“ ”按钮可删除刚添加的备忘录,如图4.10所示。图4.10 例EX4_5运行的结果C#C#教程教程SortedList类表示键/值对的集合,这些键/值对按键排序并可按照键和索引访问。SortedList的元素是键/值对,这点和Hashtable相似,而其提供的索引的方法又和ArrayList相似。因此使用SortedList带来两者的优点,但随之也带来了效率的下降。SortedList类的常用方法及说明如表4.4所示。方 法说 明Add 将带有指定键和值的元素添加到 SortedList中Clear 从 SortedList 中移除所有元素Contains

22、 确定 SortedList 是否包含特定键ContainsKey 确定 SortedList 是否包含特定键ContainsValue 确定 SortedList 是否包含特定值CopyTo 将 SortedList 元素复制到一维 Array 实例中的指定索引位置Equals 已重载。 确定两个 Object 实例是否相等(从 Object 继承)GetByIndex 获取 SortedList 的指定索引处的值GetHashCode 用做特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用 (从 Object 继承)GetKey 获取 SortedLis

23、t 的指定索引处的键GetKeyList 获取 SortedList 中的键GetValueList 获取 SortedList 中的值IndexOfKey 返回 SortedList 中指定键的从零开始的索引IndexOfValue 返回指定的值在 SortedList 中第一个匹配项的从零开始的索引Remove 从 SortedList 中移除带有指定键的元素RemoveAt 移除 SortedList 中指定索引处的元素SetByIndex 替换 SortedList 中指定索引处的值表表4.4 SortedList4.4 SortedList类的常用方法及说明类的常用方法及说明C#C#

24、教程教程常用属性及说明如表4.5所示。属 性说 明Capacity获取或设置 SortedList 的容量Count获取 SortedList 中包含的元素数Item获取并设置与 SortedList 中的特定键相关联的值Keys获取 SortedList 中的键Values获取 SortedList 中的值表4.5 SortedList类的常用属性及说明C#C#教程教程【例例EX4_6EX4_6】利用利用SortedListSortedList设计一个备忘录。设计一个备忘录。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm项目并命名为“EX4_6”,在Form1中添加2

25、个“TextBox”、2个“GroupBox”和2个“Button”控件。(2)设置属性将button1、button2、groupBox1、groupBox2和Form1的“Text”属性分别设置为“添加”、“清空”、“填写备忘录”、“所有备忘录”和“备忘录”。将textBox2的Multiline和ScrollBars属性值设置为“True”和“Both”。(3)添加事件代码在窗体设计器中分别双击2个Button控件和窗体。因为类“SortedList”在“System.Collections”命名空间中,所以添加命名空间“using System.Collections;”,添加代码,代

26、码如下所示。C#C#教程教程(4)运行程序按“Ctrl+F5”组合键运行程序,填写重要事件的日期和重要的事件,单击“添加”按钮添加备忘录。单击“清空”按钮删除刚添加的备忘录,结果如图4.11所示。图4.11 例EX4_6运行的结果C#C#教程教程String对象不可变(只读),因为一旦创建了该对象,就不能修改它的值。有些方法或运算符(如串联运算符)看似是修改String对象,但实际上是创建一个新的包含该修改的 String对象。例如:string s1 = Hello;string s2 = World;s1 += s2;/创建了一个新的字符串实例s1C#C#教程教程StringBuilder

27、会保留自己的字符串缓冲区,在针对StringBuilder执行字符串操作时,会先检查缓冲区的大小是否能容纳新的字符串,不够时再去增加需要的内存数量,因此大幅降低了内存配置的操作次数,提高了效能。当然大多数情况下,多估算一些缓冲区空间比后来又不断加大要好。StringBuilder类的常用构造函数、方法和属性及说明如表4.6所示。构造函数/方法/属性说 明构造函数StringBuilder()初始化StringBuilder类的新实例构造函数StringBuilder(Int32)使用指定的容量初始化StringBuilder类的新实例构造函数StringBuilder(String)使用指定的

28、字符串初始化StringBuilder类的新实例方法Append在此实例的结尾追加指定对象的字符串表示形式方法AppendLine将默认的行终止符追加到此实例的末尾方法Insert将指定对象的字符串表示形式插到此实例中的指定字符位置方法Remove将指定范围的字符从此实例中移除方法Replace将此实例中所有的指定字符或字符串替换为其他的指定字符或字符串属性Capacity获取或设置可包含在当前实例所分配的内存中的最大字符数属性Chars获取或设置此实例中指定字符位置处的字符属性Length获取或设置当前StringBuilder对象的长度表表4.6 StringBuilder4.6 Stri

29、ngBuilder类的常用构造函数、类的常用构造函数、方法和属性及说明方法和属性及说明C#C#教程教程【例例EX4_7EX4_7】设计一个简单的加密解密设计一个简单的加密解密WinFormWinForm程序。程序。设计步骤如下:(1)新建WinForm项目并添加控件新建WinForm项目并命名为“EX4_7”,在Form1中添加2个“TextBox”、2个“Label”和2个“Button”控件。(2)设置属性将label1、label2、button1、button2和Form1的“Text”属性分别设置为“加密前字符串:”、“加密后字符串:”、“加密”、“清空”和“加密解密”。(3)添加事

30、件代码在窗体设计器中分别双击“加密”和“清空”按钮。添加代码,代码如下所示。C#C#教程教程(4)运行程序按“Ctrl+F5”组合键运行程序,输入要加密的字符,单击“加密”按钮,结果如图4.12所示。图4.12 加密字符串C#C#教程教程4.5.1 4.5.1 命名空间命名空间.NET Framework使用命名空间来组织众多的类,它是类的逻辑分类。当需要使用某个类时,可以使用带有命名空间的完全限定名,例如:System.Console.WriteLine(中国);其中,System是一个命名空间,Console是该命名空间中包含的类,WriteLine是该类的一个方法。如果使用using关键

31、字引入了命名空间,则不必使用完全限定名,例如:using System;Console.WriteLine(中国);C#C#教程教程【例例EX4_8EX4_8】修改修改【例例EX4_7EX4_7】,将其中的类,将其中的类“EncryptEncrypt”放在另一放在另一个命名为个命名为“NSEncryptNSEncrypt”的命名空间中。的命名空间中。设计步骤如下:(1)添加代码文件打开“解决方案资源管理器”,右击“EX4_7”“添加”“新建项”,在弹出的“添加新项”对话框中选择“代码文件”模板,使用默认名称“CodeFile1.cs”,单击“添加”按钮。(2)新建命名空间及添加代码在“Code

32、File1.cs”中引用命名空间“using System.Text;”,新建命名空间“NSEncrypt”,将“Form1.cs”中的类“Encrypt”剪切并粘贴到此命名空间中,代码如下所示。(3)“添加Form1.cs”中的代码添加命名空间“using NSEncrypt;”,代码如下。(4)运行程序按“Ctrl+F5”组合键运行程序,结果与【例EX4_7】相同。C#C#教程教程【例例EX4_9EX4_9】新建一个新建一个WinFormWinForm程序,查看程序,查看VS2008VS2008所添加的局部类。所添加的局部类。设计步骤如下:(1)新建WinForm项目新建WinForm项目

33、并命名为“EX4_9”。(2)查看代码在“解决方案资源管理器”中打开“Form1.Designer.cs”文件,代码如下。打开“Form1.cs”文件,代码如下:namespace EX4_9 public partial class Form1 : Form public Form1() InitializeComponent(); C#C#教程教程通常一个方法或过程的签名都有明确的数据类型:public void ProcessData(int i)public void ProcessData(string i)public void ProcessData(double i)这些方法的

34、签名中的int、string和double 都是明确的数据类型。在访问这些方法的过程中需要提供确定类型的参数:ProcessData(123);ProcessData(abc);ProcessData(12.34);C#C#教程教程而如果将int、string和double这些类型也当成一种参数传给方法时,方法的定义便是这样:public void ProcessData(T t)/T是int、string和double这些数据类型的指代用户在调用的时候便成了这样:ProcessData(123); ProcessData(abc);ProcessData(12.34);C#C#教程教程【例例EX4_10EX4_1

温馨提示

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

评论

0/150

提交评论