欢迎光临
免费的PDF电子书下载网站

C#语言程序设计(第2版) PDF下载

编辑推荐

 ;  ;  ;C#语言程序设计(第2版)(高职高专计算机任务驱动模式教材)主要内容包括:C#语言诞生的背景、特点以及.NET框架诞生的背景和组成;通过C#语言进行结构化程序设计、面向对象程序设计、I/O程序设计、Windows窗体程序设计、ADO.NET程序设计、ASP.NET程序设计,并介绍了一个上市公司财务分析软件的设计与实现过程。本书精心设计了80多个示例程序,每个程序都对关键的知识点做了透彻地演示,综合性的实战项目将贯穿全书的重点与难点都巧妙地融合起来。本书可作为高职高专院校及相关培训机构的培训教材,也可以作为初学者自学C#语言的参考书。 ;

内容简介

本书共8章,第1章简要介绍C#语言诞生的背景、特点以及.NET框架诞生的背景和组成等内容; 第2章讲解C#语言结构化程序设计; 第3章讲解C#语言面向对象程序设计; 第4章讲解C#语言I/O程序设计; 第5章详细讲解C#语言Windows Forms程序设计,并开发了一个类似Notepad的示例程序; 第6章讲解C#语言ADO.NET程序设计; 第7章讲解C#语言ASP.NET程序设计; 第8章详细讲解一个实际案例——上市公司财务分析软件的设计与实现过程。 本书精心设计了80多个示例程序,每个程序都对关键的知识点做了透彻的演示,本书还精心设计了一个综合性的实战项目,该项目将贯穿本书的重点与难点都巧妙地融合起来,有很好的实战效果。 本书结构编排巧妙,内容详略得当,案例设计合理,讲解深入浅出。 本书适合作为高职高专院校开设C#语言程序设计课程的教材,也适合作为社会上各种计算机培训班学习C#语言的教材,同时也可以作为读者自学C#语言的参考书。

作者简介

暂无

C#语言程序设计(第2版) PDF下载

目录

目录

第1章概述

 ;

1.1C#语言简介

 ;

1.1.1C#语言诞生的背景

 ;

1.1.2C#语言的特点

 ;

1.2.NET框架简介

 ;

1.2.1.NET框架诞生的背景

 ;

1.2.2.NET框架的组成

 ;

1.3Visual Studio.NET简介

 ;

第2章C#语言结构化程序设计

 ;

2.1语法标记

 ;

2.1.1Unicode字符转义序列

 ;

2.1.2标识符

 ;

2.1.3关键字

 ;

2.2数据类型

 ;

2.2.1数据类型分类

 ;

2.2.2结构类型

 ;

2.2.3枚举类型

 ;

2.2.4引用类型

 ;

2.3类型转换

 ;

2.3.1隐式转换

 ;

2.3.2显式转换

 ;

2.4操作符与表达式

 ;

2.4.1一元操作符

 ;

2.4.2二元操作符

 ;

2.4.3三元操作符

 ;

2.4.4操作符优先级和结合性

 ;

2.4.5表达式

 ;

2.5流程控制

 ;

2.5.1声明语句

 ;

2.5.2选择语句

 ;

 ;

2.5.3循环语句

 ;

 ;

2.5.4跳转语句

 ;

2.6异常处理

 ;

2.6.1未捕获异常

 ;

2.6.2捕获异常

 ;

2.6.3抛出异常

 ;

2.7数组

 ;

2.7.1数组的定义

 ;

2.7.2数组的初始化

 ;

2.7.3数组元素的访问

 ;

2.7.4数组常用属性与方法

 ;

第3章C#语言面向对象程序设计

 ;

3.1概述

 ;

3.1.1面向对象理论诞生的背景

 ;

3.1.2类和对象概念

 ;

3.1.3类语法格式

 ;

3.2简单类成员设计

 ;

3.2.1常量

 ;

3.2.2字段

 ;

3.2.3方法

 ;

3.2.4构造方法

 ;

3.2.5析构方法

 ;

3.2.6属性

 ;

3.3面向对象程序设计的第一个支柱——封装

 ;

3.3.1封装的概念

 ;

3.3.2通过访问修饰符实现封装

 ;

3.3.3通过传统的读方法和写方法实现封装

 ;

3.3.4通过类属性实现封装

 ;

3.4面向对象程序设计的第二个支柱——继承

 ;

3.4.1继承的概念

 ;

3.4.2继承的实现

 ;

3.4.3与父类通信

 ;

3.4.4禁止继承

 ;

3.5面向对象程序设计的第三个支柱——多态

 ;

3.5.1多态的概念

 ;

3.5.2多态的实现

 ;

3.5.3抽象类

 ;

3.6委托

 ;

3.6.1委托的声明

 ;

3.6.2委托的使用

 ;

3.6.3委托的多播

 ;

3.7接口

 ;

3.7.1接口的概念

 ;

3.7.2接口的定义

 ;

3.7.3接口的实现

 ;

3.8复杂类成员设计

 ;

3.8.1运算符重载

 ;

3.8.2索引器

 ;

3.8.3事件

 ;

第4章C#语言I/O程序设计

 ;

4.1概述

 ;

4.2目录与文件操作

 ;

4.2.1目录操作

 ;

4.2.2文件操作

 ;

4.3字符流读写文本文件

 ;

4.3.1字符流写文本文件

 ;

4.3.2字符流读文本文件

 ;

4.3.3关于字符的编码问题

 ;

4.4字节流读写文件

 ;

4.4.1创建FileStream类对象

 ;

4.4.2字节流写文件

 ;

4.4.3字节流读文件

 ;

第5章C#语言WindowsForms程序设计

 ;

5.1概述

 ;

5.2公共控件

 

5.2.1Label控件

 

5.2.2Button控件

 

5.2.3CheckBox控件

 

5.2.4RadioButton控件

 

5.2.5TextBox控件

 

5.2.6ListBox控件

 

5.2.7ComboBox控件

 

5.2.8PictureBox控件

 

5.2.9TreeView控件

 

5.2.10ListView控件

 

5.3容器控件

 

5.3.1TabControl控件

 

5.3.2SplitContainer控件

 

5.4工具控件

 

5.4.1菜单栏控件

 

5.4.2工具栏控件

 

5.4.3状态栏控件

 

5.5对话框

 

5.5.1打开文件对话框

 

5.5.2保存文件对话框

 

5.5.3字体对话框

 

5.5.4颜色对话框

 

5.6项目实验

 

第6章C#语言ADO.NET程序设计

 

6.1SQL Server 2012基础

 

6.1.1Management Studio平台的使用

 

6.1.2SQL语言基础

 

6.2ADO.NET基础

 

6.2.1ADO.NET简介

 

6.2.2数据提供程序

 

6.2.3数据集

 

6.3数据源

 

6.3.1Connection对象

 

6.3.2Command对象

 

6.3.3DataReader对象

 

6.3.4DataAdapter对象

 

6.4数据集与数据绑定

 

6.4.1在数据集中建立表间关系

 

6.4.2数据绑定

 

6.5项目实验

 

第7章C#语言ASP.NET程序设计

 

7.1Web应用程序基础

 

7.1.1HTML页面

 

7.1.2动态Web页面

 

7.2ASP.NET简介

 

7.2.1支持编译型语言

 

7.2.2程序代码与页面内容的分离

 

7.2.3引入服务器端控件

 

7.3创建ASP.NET应用程序

 

7.3.1创建ASP.NET应用程序

 

7.3.2Web窗体涉及的物理文件

 

7.3.3Web窗体涉及的编程窗口

 

7.4ASP.NET服务器控件

 

7.4.1TextBox控件和Button控件

 

7.4.2LinkButton控件和ImageButton控件

 

7.4.3DropDownList控件

 

7.4.4CheckBox控件和RadioButton控件

 

7.4.5RequiredFieldValidator控件

 

7.4.6GridView控件

 

7.5ASP.NET客户端控件

 

第8章上市公司财务分析软件的设计与实现

 

8.1准备工作

 

8.1.1财务基础知识

 

8.1.2软件功能分析

 

8.1.3开发环境介绍

 

8.2数据库设计

 

8.3软件设计

 

8.3.1主界面设计

 

8.3.2实现“公司信息浏览”功能

 

8.3.3报表界面设计

 

8.3.4实现“财务报表查看”功能

 

8.3.5实现“财务报表分析”功能

 

参考文献

媒体评论

评论

前沿

前言

开发Windows软件的程序员都希望又快又好地开发出满足用户需求的软件产品,当然这除了要依靠程序员的能力和勤奋以外,还要有好用的软件开发平台支持,正所谓“工欲善其事,必先利其器”。自2002年微软推出C#语言和.NET平台以来,经过十几年的发展,现在已经有越来越多的程序员开始利用C#语言和.NET平台来开发各种应用软件。作为一个软件开发平台,.NET框架提供了一个庞大的类库,该类库以面向对象的方式全新封装了Windows底层的各种API函数,通过它,程序员可以高效地开发各种应用软件,从而摆脱了“编程语言 Win32 API函数”的低效率软件开发模式。在.NET框架类库中,有两个非常重要的技术,那就是ADO.NET和ASP.NET,前者是数据访问平台,后者是Web开发平台,它们为开发目前热门的数据库程序和Web应用程序提供了强有力的支持。另外,利用.NET类库开发的程序,将编译成MSIL(微软中间语言)代码,并需要在.NET框架中的托管平台CLR(公共语言运行库)上运行,CLR将为其提供安全保证和垃圾回收等功能。C#语言是一种优雅的编程语言,它汲取了目前几种如C 、Java和Visual Basic等主流编程语言的精华,拥有语法简洁、面向对象、类型安全和垃圾回收等现代语言的诸多特征,从而成为利用.NET平台开发应用程序的最佳编程利器。为了更好地利用C#语言(当然还包括其他支持.NET平台开发的语言)和.NET框架类库开发应用程序,微软开发了当今最优秀的集成开发环境之一——Visual Studio.NET。这是一个多语言统一的、多组件集成的、可视化的编程环境,它可以有效地加速应用软件的开发过程,快速构建商业中间层组件,并有助于开发人员构建可靠的、可伸缩的企业级解决方案。本书是一本详细讲解C#语言程序设计的教材,全书共8章。第1章简要介绍C#语言、.NET框架和Visual Studio.NET开发工具; 第2章讲解如何通过C#语言进行结构化程序设计; 第3章讲解如何通过C#语言进行面向对象程序设计; 第4章讲解如何通过C#语言进行I/O程序设计; 第5章讲解如何通过C#语言进行Windows Forms程序设计; 第6章讲解如何通过C#语言进行ADO.NET程序设计; 第7章讲解如何通过C#语言进行ASP.NET程序设计; 第8章讲解实战案例“上市公司财务分析软件”的开发过程。 
本书的第一版出版于2011年,距今已近5年多了,C#语言和.NET框架发生了很大变化,为了反映这种变化,作者对书中所有的案例代码用新平台进行了重新编写,并改写了若干章节内容,如蒙读者诸君指出书中的不足之处,将不胜感激。

编者2016.9

免费在线读


第3章C#语言面向对象程序设计

3.1概述C#语言面向对象程序设计的核心是类设计,而类设计的主要内容就是类成员设计。本章重点讲解各种类成员的设计方法及面向对象程序设计的3大支柱: 封装、继承和多态。最后讲委托与接口两种引用类型。
3.1.1面向对象理论诞生的背景
首先来了解一下面向对象理论诞生的背景。
1. 早期的程序设计1946年,第一台计算机ENIAC(埃尼阿克)诞生于美国的宾夕法尼亚大学,从那以后的近20年里,人们通过机器代码和汇编语言进行编程,所编写的程序高度依赖于特定的机器。尽管在这期间诞生了一些语言(如BASIC语言、COBOL语言等),但是这些语言编制的程序存在混乱的跳转和分支,导致程序的阅读性很差,开发效率很低。随着计算机硬件的发展以及对软件的需求日益增加,早期的程序设计语言越来越无法满足人们的需要,于是C语言诞生了。
2. 结构化程序设计1978年,Dennis Ritchie(丹尼斯·里奇)发明了C语言,标志着现代程序设计语言的诞生。C语言功能强大,简洁高效,充满了结构化编程的思想(如自顶向下、逐步求精的思想; 顺序、选择、循环3种编程结构; 去掉goto语句等),程序员可以规范、高效地编制程序。C语言获得了空前的成功,直到今天它依然被广泛使用。C语言是如此的成功,人们还需要新的编程语言吗?答案是: 需要!因为人们开发的程序越来越复杂。

3. 面向对象程序设计1965年,Intel公司创始人摩尔提出了一个著名的“摩尔定律”,大致的内容是“半导体集成电路的密度或容量每18个月翻一番”,这不是一个物理或数学定律,它仅是一种对未来趋势的预测,但是这个预测的精准被之后40多年计算机硬件的发展不断地验证。硬件的高速发展直接刺激了软件的发展,导致软件的规模和复杂性超出了结构化编程的极限,为了解决这个问题,面向对象编程诞生了。面向对象编程的基本思想就是通过封装、继承和多态等手段来管理复杂的编程。1979年,Bjarne Stroustrup(布贾尼·施特劳斯特卢普)发明了C 。最初这种语言被称为“带类的C”,1983年改名为C 。C 语言除了包括C语言所有的特点外,还实现了面向对象编程的思想。20世纪80年代末,C 成为主流的编程语言。
自20世纪90年代以来,互联网异军突起,使得Web开发变得越来越重要,C 语言不合时宜的地方开始凸显出来。这时,Java语言(1995年诞生)和C#语言(2002年诞生)出现了,这两种语言更适合于今天的互联网开发,也把面向对象理论发挥到了极致,成为今天软件设计人员的必修理论。下面开始学习面向对象理论。
3.1.2类和对象概念1. 类
初学面向对象理论首先要搞懂的就是“类”这个概念。什么是类?下面举两个例子说明。
例1: 汽车的设计与制造。
大家知道,汽车厂在生产汽车之前,肯定要先设计汽车,汽车的每个组成部分(如发动机、底盘、车身和电器等)都需要先画出图纸,然后才能谈加工制造。一旦设计的图纸确定了就可以生产出大量的一模一样的汽车来。从面向对象理论的角度来看,图纸就是所谓的“类”,或者说是生产汽车的“模板”。

例2: 员工的管理。
任何一个单位都有一套对员工的管理办法,最起码得建立员工档案,把每个员工的基本信息(如姓名、性别、出生日期、学历、住址和联系电话等)都保存起来,以便于将来组织工作。可以将收集来的这些员工信息比作一个“模板”,以后再有新员工,就按照这个“模板”填写即可。尽管每个员工还有自己隐私性的信息,但是单位不关心,也没有必要关心,它只关心模板涉及的信息。从面向对象理论的角度来看,这个员工信息的“模板”就是所谓的“类”,它是单位员工共性的一种抽象。

通过上面的例子,应该对类有了一些感性认识,下面再给类下一个理性的定义。类是一种自定义的数据类型,是一种数据结构,它可以包含数据成员(如常量和字段),也可以包含方法成员(如方法、属性、构造方法、析构方法、事件、索引和操作符等)和嵌套类型。
2. 对象讲到类就不能不讲对象,这二者是相伴而生的。那么什么是对象?这与对类的理解有关。前面讲类时有一个提法,即类是模板。对象就是根据模板“生产”出来的产品(如一辆具体的汽车),或者抽象模板时所涉及的某个个体(如一名具体的员工)。
由此看来,类和对象就有了这样一种关系: 类是对象的模板,对象是类的某个实例。在面向对象理论中,由类创建对象的过程称为实例化。
了解了上述概念就可以进入类设计的讲解了。
3.1.3类语法格式面向对象程序设计的主要工作就是设计类,定义类的语法格式如下: 
[类修饰符]class类名[:基类]
{
...
}

在上面的语法格式中,[ ]表示可选; 类修饰符与类的封装有关,这将在3.3节讲解; class是定义类的关键字; 类名必须是一个合法的标识符,但是要注意,按照C#语言的编程规范,通常类名首字母要大写; 基类与类的继承有关,这将在3.4节讲解; { }代表类主体; 省略号部分代表可在类中定义的各种类成员,这是要重点讲解的地方。
3.2简单类成员设计
在C#语言中,一个简单的类可以包含常量、字段、方法、构造方法、析构方法和属性等成员,下面将详细地讲解这些知识。
3.2.1常量为了使用方便,类中使用的常数值通常会起个容易理解的别名,这个别名称为常量。定义一个常量需要指明4个内容: 可访问性、数据类型、常量名和常量值。例如: 
public const double PI = 3.14;

在上述代码中,public指明了常量的可访问性,具体含义参见本章3.3.2小节; const是定义常量的关键字; double表示常量的类型; PI就是定义的常量名; 等号右边的“3.14”则是常量PI对应的值。程序中为什么要定义常量?这通常出于两个方面的考虑: 一是在程序中直接使用数值有突兀之嫌(即通常所说的“魔数”),不如起个别名好懂; 二是如果程序中多处使用某个数值,将来一旦需要对该数值进行修改,就会是个很麻烦而且容易出错的工作。如果程序中事先对该数值定义了常量,那么只要在常量定义的地方修改其值即可,其他地方由于使用了常量名而自动使用修改后的常量值。
3.2.2字段在类中(方法之外)定义的变量称为字段。通常情况下,定义一个字段需要指明4个内容: 可访问性、数据类型、字段名和字段值。例如: 
public doublearea=0.0;
在上述代码中,public指明了字段的可访问性,具体含义可参见本章3.3.2小节; double表示字段的数据类型; area是定义的字段名; 等号右边的“0.0”则是字段值。
3.2.3方法在类中定义的函数又称为方法。通常情况下,定义一个方法需要指明4个内容: 可访问性、返回值类型、方法名和参数。例如: 

public double GetArea(double r)
{
return PI*r*r;
}

在上述代码中,public指明了方法的可访问性,具体含义可参见本章3.3.2小节; double表示方法的返回值类型; GetArea为方法名; r则是方法定义的参数。下面通过一个示例程序来演示如何定义常量、字段和方法。程序清单: codes\03\ConstFieldMethodDemo\Program.cs

1namespace ConstFieldMethodDemo
2{
3class Circle
4{
5//常量
6public const double PI = 3.14;
7//字段
8public double Radius=0.0;
9//方法
10public double GetArea() 
11{
12return PI * Radius * Radius;
13}
14public double GetPerimeter()
15{
16return 2 * PI * Radius;
17}
20}
21class Program
22{
23static void Main(string[] args)
24{
25Console.WriteLine("常量、字段和方法演示程序");
26Console.WriteLine("======================");
27Circle c = new Circle();
28c.Radius = 10.1;
29double area = c.GetArea();
30double perimeter = c.GetPerimeter();
31Console.WriteLine("面积={0},周长={1}", area, perimeter);
32Console.WriteLine();
33}
34}
35}

代码解释: (1) 第6行代码定义了常量PI。(2) 第8行代码定义了字段Radius。(3) 第10行~第13行代码定义了方法GetArea()。(4) 第14行~第17行代码定义了方法GetPerimeter ()。(5) 第27行代码创建Circle类型的一个对象,其中Circle是类名,c是自定义的对象变量名,new是用来创建对象的关键字,Circle()是调用Circle类的构造方法。关于构造方法的细节可参见本书3.2.4小节内容。本行代码是通过类创建对象的基本语法。(6) 第28行代码是个赋值语句,它为对象c的Radius字段赋值,引用对象的字段要通过“.”运算符进行。(7) 第29行代码是调用对象c的GetArea()方法,返回值赋给一个double类型的变量area,引用对象的方法要通过“.”运算符进行。(8) 第31行代码中的“{0}”和“{1}”是两个占位符,程序运行时它们将会被跟在后边的两个变量area和perimeter按次序替换掉。程序运行结果如图31所示。

图31常量、字段和方法演示程序运行结果

3.2.4构造方法
每个对象都是有状态的,这个状态就是对象所拥有的各个字段的值。试想一下,对象在诞生之初,它的状态是什么样的?可通过什么手段来设置它的状态?上述问题可由构造方法来处理。构造方法与普通方法相比,有几处特殊的地方。首先,它的名字必须与类的名字相同; 其次,它不能被直接调用,可以在创建对象时通过new关键字间接调用; 最后,它没有返回值。构造方法允许重载,这样就可以通过多种方式来初始化对象。下面通过一个示例程序学习构造方法的定义及使用方法。
程序清单: codes\03\ConstructorDemo\Program.cs
1namespace ConstructorDemo
2{
3class Student
4{
5public string ID;//学号
6public string Name;  //姓名
7public int Age;  //年龄
8//无参构造方法
9public Student()
10{
11ID = "空";
12Name = "空";
13Age = 0;
14}
15//有参构造方法
16public Student(string id, string name, int age)
17{
18ID = id;
19Name = name;
20Age = age;
21}
22//显示字段信息
23public void ShowStudent()
24{
25Console.WriteLine("学号: {0},姓名: {1},年龄: {2}", ID, Name, Age);
26}
27}
28class Program
29{
30static void Main(string[] args)
31{
32Console.WriteLine("构造函数演示程序");
33Console.WriteLine("===================================");
34Student stu1 = new Student();
35stu1.ShowStudent();
36Student stu2 = new Student("0901", "王怡然", 20);
37stu2.ShowStudent();
38Console.WriteLine();
39}
40}
41}

代码解释: 
(1) 第9行~第14行代码定义了一个无参数的构造方法,用于对有关字段进行默认值初始化。(2) 第16行~第21行代码定义了一个有参数的构造方法,用于对有关字段进行非默认值初始化。构造方法是可以有多个的,只要参数的类型或个数不同即可,这就是所谓的构造方法重载。这种重载机制允许使用多种手段初始化对象的状态。(3) ShowStudent()方法用于显示Student对象的状态信息。(4) Main()方法中的代码演示了两种构造方法的使用方法。程序运行结果如图32所示。

图32构造方法演示程序运行结果

3.2.5析构方法
前面所讲的构造方法是在创建对象时自动调用的,而析构方法则是在销毁对象时自动调用的。也就是说,如果有一些操作想在销毁对象时执行,那么这些操作就可以放在析构方法里。析构方法是可以在类中定义的一种特殊成员,它的特殊之处有如下几点。(1) 析构方法的名字必须和类名相同,并要添加一个前缀符号“~”。(2) 析构方法名字前不能添加访问修饰符,如public。(3) 析构方法没有参数,不能重载,一个类最多只能有一个析构方法。(4) 析构方法不能直接调用,它只能在对象处于可销毁状态时,由CLR的垃圾回收器在稍后的某个不确定时刻执行。请看下面的例子。程序清单: codes\03\DestructorDemo\Program.cs
1namespace DestructorDemo
2{
3class Student
4{
5public Student()
6{
7Console.WriteLine("对象创建");
8}
9~Student()
10{
11Console.WriteLine("对象销毁");
12}
13}
14class Program
15{
16static void Main(string[] args)
17{
18Console.WriteLine("析构方法演示程序");
19Console.WriteLine("==========================");
20Student stu = new Student();
21}
22}
23}

代码解释: (1) 第5行~第8行代码定义了Student类的构造方法。(2) 第9行~第12行代码定义了Student类的析构方法。(3) 在Main()方法中,第20行代码创建了Student对象,然后程序结束。程序运行结果如图33所示。从程序的运行结果看,析构方法得到了执行。

图33析构方法演示程序运行结果

3.2.6属性C#中的类是个静态概念,而由类创建的对象则属于动态概念。对象通常创建于内存中,它有生命周期,有各种状态,这个状态就是对象的特征,也称为对象的属性。C#语言可以通过类字段来定义对象的特征。例如,在3.2.4小节ConstructorDemo示例中,Student类包含三个类字段: ID(学号)、Name(姓名)和Age(年龄)。它们定义了Student对象的状态特征。用类字段定义对象特征在语法上是简单的,但是存在弊端。如果程序员给类字段赋一个逻辑上非法或无效的值时,类字段无法识别,只能被动接受。例如,将ConstructorDemo示例中第36行代码改动如下: 
36Student stu2 = new Student("0901", "王怡然", -20);

那么Student类的构造方法中的第三个参数“-20”是传递给年龄属性Age的,这显然不合情理,但是赋值依然会成功。实际上C#语言在语法上提供了避免这种问题的机制,那就是专有的“属性”语法。请看下面的关于“属性”的示例程序。程序清单: codes\03\PropertyDemo\Program.cs
1namespace PropertyDemo
2{
3class Student
4{
5private string id;//学号
6private string name;  //姓名
7private int age;  //年龄
8public string ID
9{
10get
11{
12return id;
13}
14set
15{
16id = value;
17}
18}
19public string Name
20{
21get
22{
23return name;
24}
25set
26{
27name = value;
28}
29}
30public int Age
31{
32get
33{
34return age;
35}
36set
37{
38if (value < 0)
39age = 0;
40else
41age = value;
42}
43}
44//无参构造方法
45public Student()
46{
47ID = "空";
48Name = "空";
49Age = 0;
50}
51//有参构造方法
52public Student(string id, string name, int age)
53{
54ID = id;
55Name = name;
56Age = age;
57}
58//显示字段信息
59public void ShowStudent()
60{
61Console.WriteLine("学号: {0},姓名: {1},年龄: {2}", ID, Name, Age);
62}
63}
64class Program
65{
66static void Main(string[] args)
67{
68Console.WriteLine("属性演示程序");
69Console.WriteLine("================================"); 
70Student stu1 = new Student();
71stu1.ShowStudent();
72Student stu2 = new Student("0901", "王怡然", -20);
73stu2.ShowStudent();
74Console.WriteLine(); 
75}
76}
77}

代码解释: 
(1) 在示例ConstructorDemo中,定义公共类字段时其访问性使用public,并且字段名首字母大写,尽管这不是必须的,但是这样做更符合C#编程规范。(2) 在定义“属性”时,需要先声明一个private类型的类字段,并且其名字通常为全小写,如本例中的第5行代码即声明了一个private类型的字段id。(3) 通过“属性”语法将private类型字段进行读写包装,从而为对象用户提供使用该私有字段的接口,如本例中的第8行~第18行代码即对字段id进行了“属性”包装。(4) 属性代码初次看可能觉得有些怪异,尤其是对于学过其他编程语言(如VB和Java等)的读者。从语法上看它像方法,因为它有{}; 又不像方法,因为它没有()。另外,它的内部包含了get和set两个不常见的代码。实际上,这就是C#语言自创的“属性”语法,换句话说,上述代码就是一个属性声明。
(5) 下面详细解释一下ID属性的内涵。public声明说明对象用户可以不受限访问这个属性,ID是属性名称。用户对ID的访问无非两种: 读和写。当用户读ID属性时,get{}代码块开始工作,它通过return语句返回id。表面上读的是ID,可实际上代码返回的是id,这就是“封装”。“封装”的意义将在3.3节专门讲解。当用户写ID属性时,set{}代码块开始工作。它拥有一个内置参数value(注意,value的名称不能变,是由系统内定的),value接收用户的赋值,然后把它传递给id。表面上写的是ID,可实际上set{}代码块将写入的值通过value参数传递给了id这个私有变量,这也是“封装”。这种机制最直接的好处就是可以对用户写的值进行甄别,换句话说,它提供了数据校验的机会。(6) 仔细看看本示例的三个属性声明后会发现,这些属性声明十分相似,就像一种模板,为类字段提供了规范化的“封装”接口。程序运行结果如图34所示。

图34属性演示程序运行结果

3.3面向对象程序设计的第一个支柱——封装3.3.1封装的概念
为了理解什么是“封装”,先举两个生活当中使用“封装”的例子。
例1: 手机的使用。
平时使用的手机的内部工作原理是什么?它是怎么发送声音信号的?它又是怎么拍照的?绝大多数的手机用户是不懂的。可是,这并不影响用户使用手机,因为手机生产厂家已经通过手机外壳把它的内部器件封装起来,并在机壳上提供了显示屏以便查看,并提供了按键以便输入。换句话说,用户不用了解手机的实现细节就可以自如地操控手机,这就是“封装”带来的好处。
例2: 电视的使用。
当在家里看电视时,想换哪个台就换哪个台,想放多大声就放多大声,操作也就是动动

C#语言程序设计(第2版) pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:C#语言程序设计(第2版)