logo资料库

C#入门经典的word版.doc

第1页 / 共277页
第2页 / 共277页
第3页 / 共277页
第4页 / 共277页
第5页 / 共277页
第6页 / 共277页
第7页 / 共277页
第8页 / 共277页
资料共277页,剩余部分请下载后查看
第一章 C#语言基础
1.1C#语言特点
1.2编写控制台应用程序
1.2.1使用SDK命令行工具编写控制台程序
1.2.1使用Visual Studio.Net建立控制台程序
1.3类的基本概念
1.3.1类的基本概念
1.3.2类成员的存取控制
1.3.3类的对象
1.3.4类的构造函数和析构函数
1.3.5类的构造函数的重载
1.3.6使用Person类的完整的例子
1.4C#的数据类型
1.4.1值类型和引用类型区别
1.4.2值类型变量分类
1.4.3结构类型
1.4.4简单类型
1.4.5枚举类型
1.4.6值类型的初值和默认构造函数
1.4.7引用类型分类
1.4.8对象类(object类)
1.4.9数组类
1.4.10字符串类(string类)
1.4.11类型转换
1.5运算符
1.5.1运算符分类
1.5.2测试运算符is
1.5.3typeof运算符
1.5.4溢出检查操作符checked和unchecked
1.5.5new运算符
1.5.6运算符的优先级
1.6程序控制语句
1.6.1和C语言的不同点
1.6.2foreach语句
1.6.3异常语句
1.7类的继承
1.7.1派生类的声明格式
1.7.2 base 关键字
1.7.3 覆盖基类成员
1.7.4 C#语言类继承特点
1.8类的成员
1.8.1类的成员类型
1.8.2类成员访问修饰符
1.9类的字段和属性
1.9.1静态字段、实例字段、常量和只读字段
1.9.2属性
1.10类的方法
1.10.1方法的声明
1.10.2方法参数的种类
1.10.3静态方法和实例方法
1.10.4方法的重载
1.10.5操作符重载
1.10.6this关键字
1.11类的多态性
1.12抽象类和抽象方法
1.13密封类和密封方法
1.14接口
1.14.1接口声明
1.14.2接口的继承
1.14.3类对接口的实现
1.15代表
1.16事件
1.16.1事件驱动
1.16.2事件的声明
1.16.3事件的预订和撤消
1.17索引指示器
1.18名字空间
1.18.1名字空间的声明
1.18.2名字空间使用
1.19非安全代码
习题
第一章Windows编程的基础知识
2.1窗口
2.2Windows的消息系统
2.2.1消息驱动(事件驱动)
2.2.2事件队列
2.2.3注视窗口
2.3Windows编程接口和类库
2.3.1Windows编程接口(API)
2.3.2MFC类库
2.3.3组件库
2.3.4.NET框架类库
2.4Windows应用程序的基本结构
2.4.1最简单的Windows应用程序
2.4.2用Visual Studio.Net建立Windows应用程序框架
2.4.3方案(Solution)和项目(Project)
习题
第二章常用控件和类的使用
3.1控件通用属性
3.2Form类
3.3标签(Label)控件
3.4按钮(Button)控件
3.5事件处理函数的参数
3.6文本框(TextBox)控件
3.7Convert类
3.8单选按钮(RadioButton)和GroupBox控件
3.9Font类
3.10多选框(CheckBox)控件
3.11列表选择控件(ListBox)
3.12下拉列表组合框(ComboBox)控件
3.13ToolTip控件
3.14超级链接(LinkLable)控件
3.15定时(Timer)控件
3.16DateTime类
3.17菜单
3.18工具条
3.19状态栏(StatusBar)控件
3.20鼠标事件
3.21快捷菜单(ContextMenu)
3.22综合例子:计算器
习题:
第三章文本编辑器的实现
4.1用RichTextBox控件实现文本编辑器
4.2实现文本编辑器的剪贴板功能
4.3实现文本编辑器的存取文件功能
4.3.1 OpenFileDialog和SaveFileDialog控件
4.3.2存取文件功能的实现
4.4修改字体属性
4.4.1 FontDialog控件属性和方法
4.4.2 修改字体属性的实现方法
4.5实现About对话框
4.6实现文本编辑器查找替换功能
4.6.1 模式对话框和非模式对话框
4.6.2 写字板查找替换功能的实现
4.7提示用户保存修改的文件
4.7.1 对话框MessageBox
4.7.2 提示用户保存修改的文件的实现
4.8打印和打印预览
4.8.1 PrintDocument类
4.8.2 打印设置对话框控件PageSetupDialog
4.8.3 打印预览
4.8.4 用打印对话框PrintDialog实现打印
4.9编写多文档界面应用程序
4.9.1建立类似Microsoft Word的编辑器
4.9.2主窗口和子窗口的菜单的融合
4.9.3建立类似Visualstudio.Net的编辑器
习题
第四章图形图像编程
5.1图形设备环境接口(GDI)
5.2Graphics类
5.2.1使用Graphics类绘图的基本步骤
5.2.2窗体的Paint事件
5.3GDI+中三种坐标系统:
5.4GDI+中常用的结构
5.4.1结构Point和PointF
5.4.2结构Size和SizeF
5.4.3结构Rectangle和RectangleF
5.4.4结构Color
5.5画笔
5.6创建画刷
5.6.1单色画刷SolidBrush
5.6.2阴影画刷HatchBrush
5.6.3纹理(图像)画刷TextureBrush
5.6.4颜色渐变画刷LinearGradientBrush
5.6.5画刷PathGradientBrush
5.7基本图形的绘制和填充
5.7.1绘制线段
5.7.2ArrayList类
5.7.3画椭圆(圆)及键盘消息的使用
5.7.4画矩形
5.7.5绘制圆弧
5.7.6DrawPie方法
5.7.7Bezier曲线
5.7.8DrawPolygon方法
5.7.9DrawClosedCurve方法
5.7.10DrawCurve方法
5.7.11DrawPath方法和GraphicsPath类
5.7.12DrawString方法
5.7.13DrawImage和DrawIcon方法
5.7.14FillEllipse方法
5.7.15FillRectangle方法
5.7.16FillPie方法
5.7.17FillRegion方法和Region类
5.8Matrix类和图形的平移、变形、旋转
5.8.1Matrix类
5.8.2图形的平移、变形、旋转
5.8.3仿射矩阵
5.9图形文件格式
5.10图形框PictureBox控件
5.11Bitmap类
5.11.1Bitmap类支持的图像类型
5.11.2Bitmap类的方法
5.11.3画点
5.11.4在PictureBox中画任意曲线
5.11.5存取位图文件
5.11.6用拖动鼠标方法画椭圆或圆
5.12图像剪贴板功能
5.12.1剪贴区域选定
5.12.2剪贴板复制功能的实现
5.12.3剪贴板剪贴功能的实现
5.12.4剪贴板粘贴功能的实现
5.13图像的处理
5.13.1图像的分辨力
5.13.2彩色图像变换为灰度图像
5.13.3灰度图像处理
5.13.4动画
习题
第五章文件和流
6.1用流读写文件
6.1.1用FileStream类读写字节
6.1.2用BinaryReader和BinaryWriter类读写基本数据类型
6.1.3用StreamReader和StreamWriter类读写字符串
6.2File类和FileInfo类
6.2.1File类常用的方法
6.2.2文件打开方法:File.Open
6.2.3文件创建方法:File.Create
6.2.4文件删除方法:File.Delete
6.2.5文件复制方法:File.Copy
6.2.6文件移动方法:File.Move
6.2.7设置文件属性方法:File.SetAttributes
6.2.8判断文件是否存在的方法:File.Exist
6.2.9得到文件的属性
6.3Directory类和DirectoryInfo类
6.3.1Directory类常用的方法如下:
6.3.2目录创建方法:Directory.CreateDirectory
6.3.3目录属性设置方法:DirectoryInfo.Atttributes
6.3.4目录删除方法:Directory.Delete
6.3.5目录移动方法:Directory.Move
6.3.6获取当前目录下所有子目录:Directory.GetDirectories
6.3.7获取当前目录下的所有文件方法:Directory.GetFiles
6.3.8判断目录是否存在方法:Directory.Exist
6.4例子:查找文件
6.4.1Panel和ListView控件
6.4.2在指定文件夹中查找文件
6.5例子:拆分和合并文件
习题:
第六章多线程程序设计
7.1线程类(Thread)的属性和方法
7.2线程的创建
7.3建立线程类
7.3.1进度条(ProgressBar)控件
7.3.2用线程控制进度条
7.4线程的优先级
7.5多个线程互斥
7.5.1多个线程同时修改共享数据可能发生错误
7.5.2用LOCK语句实现互斥
7.5.3用Mutex类实现互斥
7.5.4用Monitor类实现互斥
7.6Monitor类
7.7线程的同步:生产者和消费者关系
7.7.1生产者线程和消费者线程不同步可能发生错误
7.7.2生产者线程和消费者线程同步的实现
习题:
第七章ADO.NET与数据操作
8.1数据库基本概念
8.2设计连接和不连接数据库应用程序的基本步骤:
8.3用ACCESS创建数据库
8.4结构化查询语言SQL
8.4.1 Select语句
8.4.2 Insert语句
8.4.3 Delete语句
8.4.4 Update语句
8.5用Connection对象连接数据库。
8.6Command对象
8.7DataAdapter对象
8.8DataSet对象
8.8.1 使用DataSet的优点
8.8.2 数据集DataSet概念
8.8.3 使用DataSet对象
8.8.4 为DataSet对象中的表指定主键、建立关系
8.9用DataGraid控件显示数据和数据绑定
8.10不连接数据库应用程序的完整的例子
8.11修改数据并保存修改的数据到源数据库
8.12其它数据绑定控件
8.13建立主从关系表
第八章ASP.Net编程基础知识
9.1网络基础
9.2.1局域网、广域网和INTERNET
9.2.2网络传输协议
9.2.3IP地址
9.2.4域名
9.2.5URL
9.2.6端口号
9.2.7HTML,HTTP和网页
9.2.8Web服务器和浏览器工作方式
9.2.9宿主目录、默认主页及网站
9.2.10静态网页
9.2.11客户端动态网页
9.2.12服务器端动态网页
9.2.13修改宿主目录及建立虚拟目录
9.2HTML标记语言
9.2.1HTML标记
9.2.2HTML文件结构
9.2.3语言字符集的信息
9.2.4背景色彩和文字色彩
9.2.5页面空白
9.2.6显示一幅图
9.2.7超级链接
9.2.8超级链接在新窗口打开另一网页
9.2.9标尺线
9.2.10网页中标题的字体
9.2.11网页中正文字体
9.2.12斜体、粗体字符及为字体增加下划线,删除线
9.2.13字体标记的组合使用
9.2.14字体的颜色
9.2.15客户端字体
9.2.16网页中控件的概念
9.2.17窗体控件和其它控件的使用
9.2.18例子:文字输入和密码输入
9.2.19用FontPage做网页的例子,使用复选框和单选按钮
9.3ASP.NET技术基础
9.3.1HTML服务器端控件
9.3.2Web服务器端控件
9.3.3Web Form的事件处理
9.3.4记事本编写ASP.NET动态网页
9.3.5用Visual Studio.NET实现ASP.NET动态网页
9.3.6Code Behind技术
9.3.7ASP.NET和HTML兼容
9.3.8网页中使用C#语句
第九章Web服务器端控件
10.1常用的ASP.NET服务器端控件
10.1.1Label控件
10.1.2TextBox控件
10.1.3Button、LinkButton和ImageButton控件
10.1.4CheckBox和CheckBoxList控件
10.1.5RadioButton和RadioButtonList控件
10.1.6Image控件
10.1.7HyperLink控件
10.1.8Table、TableCell和TableRow控件
10.1.9DrowDownList控件
10.2ASP.Net控件数据绑定
10.2.1数据绑定基础
10.2.2基于变量的数据绑定
10.2.3基于集合的绑定
10.2.4基于表达式绑定
10.2.5基于DataBinder.Eval方法的数据绑定
10.2.6列表绑定控件
10.3数据验证控件
10.3.1数据验证概述
10.3.2常用的验证控件
10.3.3验证控件常用的属性
10.3.4RequiredFieldValidator
10.3.5自定义数据验证控件CustomValidator控件
10.3.6ValidationSummary控件
10.3.7CompareValidator控件
10.3.8RegularExpressionValidator 控件
10.4DataGraid控件
10.4.1DataGrid控件概述
10.4.2DataGrid控件绑定数据库表
10.4.3DataGrid控件对数据库记录分页显示
10.4.4DataGrid控件对记录排序
10.4.5用BoundColumn列将标题改为中文
10.4.6增加按钮列
10.4.7增加HyperLinkColumn列
10.4.8增加EditCommandColumn列
10.4.9控件TemplateColumn的用法
10.5AdRotator控件
10.6Calender控件
10.7Visual Studio.Net实现留言板
第十章ASP.NET内建对象
11.1Request对象
11.1.1用Request对象获取另一个网页传递的数据
11.1.2用Request对象获取客户端浏览器的信息
11.1.3用Request对象获取服务器信息
11.2Response对象
11.2.1用Response对象发送信息在浏览器中显示
11.2.2用Response对象重定向浏览器
11.3Cookie对象
11.3.1用Cookie对象记录访问的次数
11.3.2网上商店购物筐实现
11.4Application对象
11.4.1Application对象属性
11.4.2方法
11.4.3事件
11.4.4例子:显示访问网站总人数
11.5Session对象
11.5.1属性
11.5.2方法
11.5.3事件
11.5.4用Session对象实现网上商店购物筐
11.6Server 对象
11.6.1属性MachineName和ScriptTimeout
11.6.2HtmlEncode方法
11.6.3URLEncode方法
11.6.4MapPath方法
习题
第十一章可扩展标记语言
12.1HTML及其缺点
12.2SGML(标准通用置标语言)
12.3XML(可扩展置标语言)
12.4XML的文档格式
12.5用XSL文件显示XML文档
12.6.NET对XML的支持
12.7ADO.NET和XML
12.8使用Visual Studio.Net建立和显示XML文档
第十二章Web服务
13.1Web服务的概念和用途
13.2建立Web服务
13.2.1用记事本建立Web服务
13.2.2用Visual Studio.Net建立Web服务
13.2.3服务描述语言(WSDL)
13.3基于.Net的Web服务客户端程序
13.3.1Web服务客户端程序代理类
13.3.2HTTP-GET、HTTP-POST和SOAP协议
13.3.3使用代理类的Web服务客户端程序
13.3.4Visual Studio.Net建立Web服务客户端程序
13.4建立Web服务客户端程序一般方法
13.5发布和发现Web服务
13.5.1Web服务目录
13.5.2Web服务发现
第一章 C#语言基础 本章介绍 C#语言的基础知识,希望具有 C 语言的读者能够基本掌握 C#语言,并以此为 基础,能够进一步学习用 C#语言编写 window 应用程序和 Web 应用程序。当然仅靠一章的 内容就完全掌握 C#语言是不可能的,如需进一步学习 C#语言,还需要认真阅读有关 C#语 言的专著。(下载源码就到源码网:www.codepub.com) 1.1 C#语言特点 Microsoft.NET(以下简称.NET)框架是微软提出的新一代 Web 软件开发模型,C#语言 是.NET 框架中新一代的开发工具。C#语言是一种现代、面向对象的语言,它简化了 C++语 言在类、命名空间、方法重载和异常处理等方面的操作,它摒弃了 C++的复杂性,更易使用, 更少出错。它使用组件编程,和 VB 一样容易使用。C#语法和 C++和 JAVA 语法非常相似, 如果读者用过 C++和 JAVA,学习 C#语言应是比较轻松的。 用 C#语言编写的源程序,必须用 C#语言编译器将 C#源程序编译为中间语言(MicroSoft Intermediate Language,MSIL)代码,形成扩展名为 exe 或 dll 文件。中间语言代码不是 CPU 可执行的机器码,在程序运行时,必须由通用语言运行环境(Common Language Runtime, CLR)中的既时编译器(JUST IN Time,JIT)将中间语言代码翻译为 CPU 可执行的机器码,由 CPU 执行。CLR 为 C#语言中间语言代码运行提供了一种运行时环境,C#语言的 CLR 和 JAVA 语言的虚拟机类似。这种执行方法使运行速度变慢,但带来其它一些好处,主要有:  通用语言规范(Common Language Specification,CLS):.NET 系统包括如下语言:C#、 C++、VB、J#,他们都遵守通用语言规范。任何遵守通用语言规范的语言源程序,都 可编译为相同的中间语言代码,由 CLR 负责执行。只要为其它操作系统编制相应的 CLR,中间语言代码也可在其它系统中运行。  自动内存管理:CLR 内建垃圾收集器,当变量实例的生命周期结束时,垃圾收集器负 责收回不被使用的实例占用的内存空间。不必象 C 和 C++语言,用语句在堆中建立的 实例,必须用语句释放实例占用的内存空间。也就是说,CLR 具有自动内存管理功能。  交叉语言处理:由于任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言 代码,不同语言设计的组件,可以互相通用,可以从其它语言定义的类派生出本语言的 新类。由于中间语言代码由 CLR 负责执行,因此异常处理方法是一致的,这在调试一 种语言调用另一种语言的子程序时,显得特别方便。  增加安全:C#语言不支持指针,一切对内存的访问都必须通过对象的引用变量来实现, 只允许访问内存中允许访问的部分,这就防止病毒程序使用非法指针访问私有成员。也 避免指针的误操作产生的错误。CLR 执行中间语言代码前,要对中间语言代码的安全 性,完整性进行验证,防止病毒对中间语言代码的修改。  版本支持:系统中的组件或动态联接库可能要升级,由于这些组件或动态联接库都要在 注册表中注册,由此可能带来一系列问题,例如,安装新程序时自动安装新组件替换旧 组件,有可能使某些必须使用旧组件才可以运行的程序,使用新组件运行不了。在.NET 中这些组件或动态联接库不必在注册表中注册,每个程序都可以使用自带的组件或动态 联接库,只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹 bin 中,运 行程序就自动使用在 bin 文件夹中的组件或动态联接库。由于不需要在注册表中注册, 1
软件的安装也变得容易了,一般将运行程序及库文件拷贝到指定文件夹中就可以了。  完全面向对象:不象 C++语言,即支持面向过程程序设计,又支持面向对象程序设计, C#语言是完全面向对象的,在 C#中不再存在全局函数、全区变量,所有的函数、变量 和常量都必须定义在类中,避免了命名冲突。C#语言不支持多重继承。 1.2 编写控制台应用程序 1.2.1使用 SDK 命令行工具编写控制台程序 第一个程序总是非常简单的,程序首先让用户通过键盘输入自己的名字,然后程序在屏 幕上打印一条欢迎信息。程序的代码是这样的: using System;//导入命名空间。//为C#语言新增解释方法,解释到本行结束 class Welcome//类定义,类的概念见下一节 { /*解释开始,和C语言解释用法相同 解释结束*/ static void Main()//主程序,程序入口函数,必须在一个类中定义 { Console.WriteLine("请键入你的姓名:");//控制台输出字符串 Console.ReadLine();//从键盘读入数据,输入回车结束 Console.WriteLine("欢迎!"); } } 可以用任意一种文本编辑软件完成上述代码的编写,然后把文件存盘,假设文件名叫做 welcome.cs,C#源文件是以cs作为文件的扩展名。和C语言相同,C#语言是区分大小写的。 高级语言总是依赖于许多在程序外部预定义的变量和函数。在C或C++中这些定义一般放到头 文件中,用#include语句来导入这个头文件。而在C#语言中使用using语句导入名字空间, using System语句意义是导入System名字空间,C#中的using语句的用途与C++中#include 语句的用途基本类似,用于导入预定义的变量和函数,这样在自己的程序中就可以自由地使 用这些变量和函数。如果没有导入名字空间的话我们该怎么办呢?程序还能保持正确吗?答 案是肯定的,那样的话我们就必须把代码改写成下面的样子: class Welcome { static void Main() { System.Console.WriteLine("请键入你的姓名:"); System.Console.ReadLine(); System.Console.WriteLine("欢迎!"); } } 也就是在每个Console前加上一个前缀System.,这个小原点表示Console是作为System 的成员而存在的。C#中抛弃了C和C++中繁杂且极易出错的操作符象::和->等,C#中的复合名 字一律通过.来连接。System是.Net平台框架提供的最基本的名字空间之一,有关名字空间 的详细使用方法将在以后详细介绍,这里只要学会怎样导入名字空间就足够了。 程序的第二行class Welcome声明了一个类,类的名字叫做Welcome。C#程序中每个变量 或函数都必须属于一个类,包括主函数Main(),不能象C或C++那样建立全局变量。C#语言程 序总是从Main()方法开始执行,一个程序中不允许出现两个或两个以上的Main()方法。请牢 2
记C#中Main()方法必须被包含在一个类中,Main第一个字母必须大写,必须是一个静态方法, 也就是Main()方法必须使用static修饰。static void Main()是类Welcome中定义的主函数。 静态方法意义见以后章节。 程序所完成的输入输出功能是通过Console类来完成的,Console是在名字空间System 中已经定义好的一个类。Console类有两个最基本的方法WriteLine和ReadLine。ReadLine 表示从输入设备输入数据,WriteLine则用于在输出设备上输出数据。 如果在电脑上安装了Visual Studio.Net,则可以在集成开发环境中直接选择快捷键或 菜单命令编译并执行源文件。如果您不具备这个条件,那么至少需要安装Microsoft.Net Framework SDK,这样才能够运行C#语言程序。Microsoft.Net Framework SDK中内置了C# 的编译器csc.exe,下面让我们使用这个微软提供的命令行编译器对程序welcome.cs进行编 译。假设已经将welcome.cs文件保存在d:\Charp目录下,启动命令行提示符,在屏幕上输入 一行命令:d:回车,cd Charp回车,键入命令: C:\WINNT\Microsoft.NET\Framework\v1.0.3705\csc welcome.cs 如果一切正常welcome.cs文件将被编译,编译后生成可 执行文件Welcome.exe。可以在命令提示符窗口运行可执行 文件Welcome.exe,屏幕上出现一行字符提示您输入姓名: 请键入你的姓名:输入任意字符并按下回车键,屏幕将打印 出欢迎信息:欢迎! 注意,和我们使用过的绝大多数编译器不同,在 C#中 编译器只执行编译这个过程,而在 C 和 C++中要经过编译和 链接两个阶段。换而言之 C#源文件并不被编译为目标文件.obj,而是直接生成可执行文 件.exe 或动态链接库.dll,C#编译器中不需要包含链接器。 1.2.1使用 Visual Studio.Net 建立控制台程序 (1) 运行 Visual Studio.Net 程序,出现如图 1.2.2A 界面。 (2) 单击新建项目按钮,出现如图 1.2.2B 对话框。在项目类型(P)编辑框中选择 Visual C#项 目,在模板(T)编辑框中选择控制台应用程序,在名称(N)编辑框中键入 e1,在位置(L) 编辑框中键入 D:\csarp,必须预先创建文件夹 D:\csarp。也可以单击浏览按钮,在打开文 件对话框中选择文件夹。单击确定按钮,创建项目。出现如图 1.2.2C 界面。编写一个应 用程序,可能包含多个文件,才能生成可执行文件,所有这些文件的集合叫做一个项目。 (3) 修改 class1.cs 文件如下,有阴影部分是新增加的语句,其余是集成环境自动生成的。 using System; namespace e1 { /// /// Class1 的摘要说明。 /// class Class1 { /// /// 应用程序的主入口点。 /// [STAThread] 3
static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // Console.WriteLine("请键入你的姓名:"); Console.ReadLine(); Console.WriteLine("欢迎!"); } } } (4) 按 CTRL+F5 键,运行程序,如右图,和 1.2.1 节运行效果 相同。屏幕上出现一行字符,提示您输入姓名:请键入 你的姓名:输入任意字符并按下回车键,屏幕将打印出 欢迎信息:欢迎!输入回车退出程序。 图 1.2.2A 4
图 1.2.2B 图 1.2.2C(下载源码就到源码网:www.codepub.com) 5
1.3 类的基本概念 C#语言是一种现代、面向对象的语言。面向对象程序设计方法提出了一个全新的概念: 类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类 中,类的实例则称为对象。这就是我们常说的封装性。 1.3.1 类的基本概念 类可以认为是对结构的扩充,它和 C 中的结构最大的不同是:类中不但可以包括数据, 还包括处理这些数据的函数。类是对数据和处理数据的方法(函数)的封装。类是对某一类 具有相同特性和行为的事物的描述。例如,定义一个描述个人情况的类 Person 如下: using System; class Person//类的定义,class是保留字,表示定义一个类,Person是类名 { Console.WriteLine("姓名:{0},年龄:{1}",name,age); private string name="张三";//类的数据成员声明 private int age=12;//private表示私有数据成员 public void Display()//类的方法(函数)声明,显示姓名和年龄 { } public void SetName(string PersonName)//修改姓名的方法(函数) { } public void SetAge(int PersonAge) { } name=PersonName; age=PersonAge; } Console.WriteLine("姓名:{0},年龄:{1}",name,age)的意义是将第二个参数变量 name 变为字符串填到{0}位置,将第三个参数变量 age 变为字符串填到{1}位置,将第一个 参数表示的字符串在显示器上输出。 大家注意,这里我们实际定义了一个新的数据类型,为用户自己定义的数据类型,是对 个人的特性和行为的描述,他的类型名为 Person,和 int,char 等一样为一种数据类型。用 定义新数据类型 Person 类的方法把数据和处理数据的函数封装起来。类的声明格式如下: 属性 类修饰符 class 类名{类体} 其中,关键字 class、类名和类体是必须的,其它项是可选项。类修饰符包括 new、public、 protected、internal、private、abstract 和 sealed,这些类修饰符以后介绍。类体用于定义类的 成员。 1.3.2 类成员的存取控制 一般希望类中一些数据不被随意修改,只能按指定方法修改,既隐蔽一些数据。同样一 些函数也不希望被其它类程序调用,只能在类内部使用。如何解决这个问题呢?可用访问权 限控制字,常用的访问权限控制字如下:private(私有),public(公有)。在数据成员或函数成 员前增加访问权限控制字,可以指定该数据成员或函数成员的访问权限。 6
私有数据成员只能被类内部的函数使用和修改,私有函数成员只能被类内部的其它函数 调用。类的公有函数成员可以被类的外部程序调用,类的公有数据成员可以被类的外部程序 直接使用修改。公有函数实际是一个类和外部通讯的接口,外部函数通过调用公有函数,按 照预先设定好的方法修改类的私有成员。对于上述例子,name 和 age 是私有数据成员,只 能通过公有函数 SetName()和 SetAge()修改,既它们只能按指定方法修改。 这里再一次解释一下封装,它有两个意义,第一是把数据和处理数据的方法同时定义在 类中。第二是用访问权限控制字使数据隐蔽。 1.3.3 类的对象 Person 类仅是一个用户新定义的数据类型,由它可以生成 Person 类的实例,C#语言叫 对象。用如下方法声明类的对象:Person OnePerson=new Person();此语句的意义是建立 Person 类对象,返回对象地址赋值给 Person 类变量 OnePerson。也可以分两步创建 Person 类的对象:Person OnePerson;OnePerson=new Person();OnePerson 虽然存储的是 Person 类 对象地址,但不是 C 中的指针,不能象指针那样可以进行加减运算,也不能转换为其它类 型地址,它是引用型变量,只能引用(代表)Person 对象,具体意义参见以后章节。和 C、C++ 不同,C#只能用此种方法生成类对象。 在程序中,可以用 OnePerson.方法名或 OnePerson.数据成员名访问对象的成员。例如: OnePerson.Display(),公用数据成员也可以这样访问。注意,C#语言中不包括 C++语言中 的->符号。 1.3.4 类的构造函数和析构函数 在建立类的对象时,需做一些初始化工作,例如对数据成员初始化。这些可以用构造函 数来完成。每当用 new 生成类的对象时,自动调用类的构造函数。因此,可以把初始化的 工作放到构造函数中完成。构造函数和类名相同,没有返回值。例如可以定义 Person 类的 构造函数如下: public Person(string Name,int Age)//类的构造函数,函数名和类同名,无返回值。 { name=Name; age=Age; } 当用 Person OnePerson=new Person(“张五”,20)语句生成 Person 类对象时,将自动调用 以上构造函数。请注意如何把参数传递给构造函数。 变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销。类的对象 被撤销时,将自动调用析构函数。一些善后工作可放在析构函数中完成。析构函数的名字为 ~类名,无返回类型,也无参数。Person 类的析构函数为~ Person()。C#中类析构函数不能显 示地被调用,它是被垃圾收集器撤销不被使用的对象时自动调用的。 1.3.5 类的构造函数的重载 在 C#语言中,同一个类中的函数,如果函数名相同,而参数类型或个数不同,认为是 不同的函数,这叫函数重载。仅返回值不同,不能看作不同的函数。这样,可以在类定义中, 7
定义多个构造函数,名字相同,参数类型或个数不同。根据生成类的对象方法不同,调用不 同的构造函数。例如可以定义 Person 类没有参数的构造函数如下: public Person()//类的构造函数,函数名和类同名,无返回值。 { name="张三"; age=12; } 用语句 Person OnePerson=new Person("李四",30)生成对象时,将调用有参数的构造 函数,而用语句 Person OnePerson=new Person()生成对象时,调用无参数的构造函数。由 于析构函数无参数,因此,析构函数不能重载。 1.3.6 使用 Person 类的完整的例子 下边用一个完整的例子说明 Person 类的使用:(VisualStudio.Net 编译通过) using System; namespace e1//定义以下代码所属命名空间,意义见以后章节 { class Person { Console.WriteLine("姓名:{0},年龄:{1}",name,age); private String name="张三";//类的数据成员声明 private int age=12; public void Display()//类的方法(函数)声明,显示姓名和年龄 { } public void SetName(string PersonName)//指定修改姓名的方法(函数) { } public void SetAge(int PersonAge)//指定修改年龄的方法(函数) { } public Person(string Name,int Age)//构造函数,函数名和类同名,无返回值 { name=PersonName; age=PersonAge; name=Name; age=Age; } public Person()//类的构造函数重载 { name="田七"; age=12; } } class Class1 { static void Main(string[] args) { Person OnePerson=new Person("李四",30);//生成类的对象 OnePerson.Display(); //下句错误,在其它类(Class1类)中,不能直接修改Person类中的私有成员。 //OnePerson.name="王五"; //只能通过Person类中公有方法SetName修改Person类中的私有成员name。 OnePerson.SetName("王五"); 8
分享到:
收藏