第二讲 C#知识回顾教学目的:
通过本次内容的学习,使同学们对已经学习过的 C#的基础知识做一个全的回顾和复习,掌握重点内容的知识体系,为
ASP.NET动态网页的开发奠定坚实的基础。
教学重点:
1,C#的循环控制结构。
2,C#常规控件的使用。
3、面向对象编程技术。
一,C#的主要特点
C#是一种源自于 C和 C++的,简单的、现代的、
面向对象的和类型安全的程序设计语言。
1,快速应用开发( RAD)功能;
2,强大的 Web服务端组件;
3,支持跨平台 ;
4.与 XML的融合 ;
5,对 C++的继承二,C#中的数据类型
C#的值类型可以分为值类型和引用类型,值类型又可以分为:简单类型、结构类型、枚举类型。
1.简单类型是数值类型的一种,是组成应用程序的基本组成部件,例如数值( 1,2,3)、
布尔值 ( true 或 false),字符( a,b,c)等被使用在不同的场合。如图:
简 单 类 型浮 点 类 型布 尔 类 型小 数 类 型字 符 型字 符 串 类 型整 数 类 型单 精 度 浮 点 类 型双 精 度 浮 点 类 型无 符 号 型有 符 号 型
( 1)整数类型整数类型可以分为无符号型和有符号型,
其中无符号型包括,byte,ushort,uint和
ulong;有符号型包括,sbyte,short,int和
long。
byte类型对应于,NET Framework中定义的
System.Byte类,其大小为一个字节,取值范围从 0到 255。 sbyte类型对应于,NET
Framework中定义的 System.SByte类,其大小为一个字节,取值范围从 -128到 127。
ushort类型对应于,NET Framework中定义的
System.Uint16类,其大小为二个字节,取值范围从 0到 65,535。 short类型对应于,NET
Framework中定义的 System.Int16类,其大小为二个字节,取值范围从 -32,768到 32,767。
uint类型对应于,NET Framework中定义的
System.Uint32类,其大小为四个字节,取值范围从 0到 4,294,967,295。 int类型对应于,NET Framework中定义的 System.Int32类,
其大小为四个字节,取值范围从 -
2,147,483,648到 2,147,483,647。
ulong类型对应于,NET Framework中定义的
System.Uint64类,其大小为八个字节,取值范围从 0到 18,446,744,073,709,551,615。
long类型对应于,NET Framework中定义的
System.Int64类,其大小为八个字节,取值范围从 -9,223,372,036,854,775,808到
9,223,372,036,854,775,807。
( 3) 浮点类型在 C#中有两种浮点类型:单精度浮点
( float)类型和双精度浮点( double)类型。
单精度浮点类型对应于,NET Framework中定义的 System.Single类,其大小为四个字节,
取值范围为 1.5x10-45到 3.4x1038,有 7位数字位精度。双精度浮点类型对应于,NET
Framework中定义的 System.Double类,其大小为八个字节,取值范围为 5.0x10-324到
1.7x10308,有 15到 16位数字位精度。
( 2) 布尔类型布尔( bool)类型表示布尔逻辑量,对应于,NET Framework中定义的 System.Boolean
类。布尔类型的可能值为 true和 false(仅有
true和 false两个布尔值),其中 true表示逻辑真,false表示逻辑假。可以直接将 true或 false
值赋给一个布尔变量,或将一个逻辑判断语句的结果赋给布尔类型的变量。
( 4) 小数类型小数( decimal)类型在所有数值类型中精度是最高的,它有 128位,一般做精度要求高的金融和货币的计算。 decimal类型对应于,NET Framework中定义的 System.Decimal
类。取值范围大约为 1.0x10-28 到 7.9x1028,
有 28~29位的有效数字。
( 5) 字符型字符( char)型用于表示单个的 Unicode
字符,可以表示世界上大多数的语言中的字符。 char类型对应于,NET Framework中定义的 System.Char类。单个 Unicode字符为 16位长,因此字符型的长度也是 16位长(两个字节)。在 C/C++中,字符型可以和整数类型相互转换,在 C#中字符型无法隐式转换的转换为整数类型,但是可以显式转换。
( 6) 字符串 类型字符串实际上是 Unicode字符的连续集合
,通常用于表示文本,而 String是表示字符串的 System.Char 对象的连续集合。在 C#中提供了对字符串( string)类型的强大支持,可以对字符串进行各种的操作。 string类型对应于,NET Framework中定义的 System.String类
,System.String类是直接从 object派生的,并且是 final类,不能从它再派生其他类。
2,结构类型把一系列相关的变量组织成为一个单一实体的过程,称为生成结构的过程。这个单一实体的类型我们就叫做结构类型,每一个变量称为结构的成员。结构类型的变量采用 struct来进行声明。
(1)定义一个结构类型下面的程序代码说明定义一个通讯录记录结构(包括姓名、电话和地址)的定义。
Struct PhoneBook{
public string name;
public string phone;
public string address;
}
( 2)定义一个结构类型的变量
PhoneBook p1;
p1就是一个通讯录( PhoneBook)结构类型的变量。上面声明中的,public”表示对结构类型的成员的访问权限。对结构成员的访问通过结构变量名加上访问符,.”号,后跟成员的名称,p1.name=″tom″;
结构类型包含的成员类型没有限制,可以相同也可不同。
3,枚举类型枚举( enum)实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。
下面的程序代码声明了一个代表星期的枚举类型的变量。
Enum WeekDay{
Sunday,Monday,Tuesday,Wednesday,
Friday,Saturday
};
WeekDay day;
注意:枚举类型的变量在某一时刻只能取枚举中某一个元素的值。
4,数组数组是一组类型相同的有序数据。数组按照数组名、数据元素的类型和维数来进行描述。 C#中提供 Ststem.Array类是所有数组类型的基类。
数组的声明格式为:
数据类型[] 数组名 = new 数据类型 [ ];
比如我们声明一个整数数组:
int[] arr;
在定义数组时,可以预先指定数组元素的个数,这时在“[]”中定义数组的元素个数,
它的个数可以通过数组名加圆点加,Length”获得。而在使用数组时,可以在“[]”中加入下标来取得对应的数组元素。 C#中的数组元素的下标是从 0开始的,以后递增。
在 C#中数组可以是一维的也可以是多维的,
同样也支持矩阵和参差不齐的数组。其中一维数组最为普遍,用得也最多。
二,变量与常量有关变量和常量的知识都是任何一门编程语言的基础知识,而每一门编程语言都有自己相对应的变量和常量的命名规则和使用方式。
1,变量程序要对数据进行读、写、运算等操作,当需要保存特定的值或计算结果时,就需要用到变量( Variable)。在 C#中,我们把变量分为七种:静态变量、非静态变量、局部变量、数组元素、值参数、引用参数和输出参数等。
2,常量所谓常量就是其值固定不变的量。常量声明的格式如下:
修饰符 const 数据类型 常量的名字 ;
如:
public const double X=1.0,Y=2.0,Z=3.0;
三,运算符和表达式
1,运算符在 C#中主要有算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符。
( 1)算术运算符算术运算符主要用于数学计算中,主要有加法运算符( +),减法运算符( –),乘法运算符( *),除法运算符( /),求模运算符( %),
自加运算符( ++)和自减运算符( --)。
( 2) 赋值运算符赋值运算符用于将一个数据赋予一个变量、
属性或者引用,数据可以是常量,也可以是表达式。前面已经多次使用了简单的等号,=”赋值运算符,例如 int a=1,或者 int c=a+b。其实,
除了等号运算符,还有一些其他的赋值运算符,
它们都非常有用。这些赋值运算符都是在,=”
之前加上其他运算符,这样就构成了复合的赋值运算符。复合赋值运算符的运算非常简单,
例如,a+=1”就等价于,a=a+1”,它相当于对变量进行一次自加操作。
( 3) 关系运算符关系运算符表示了对操作数的比较运算,
有关系运算符组成的表达式就是关系表达式。
关系表达式的结果只可能有两种即,true”或
,false”。
( 4) 逻辑运算符逻辑运算符主要用于逻辑判断,主要包括逻辑与,逻辑或和逻辑非。由逻辑运算符组成的表达式是逻辑表达式,其值只可能有两种即
,true”或,false”。
( 5) 条件运算符
C#中唯一的一个三元操作符就是条件运算符(?:),由条件运算符组成的表达式就是条件表达式,条件表达式的一般格式为:操作数 1?操作数 2:操作数 3。其中,“操作数 1”
的值必须为逻辑值,否则将出现编译错误。
进行条件运算时,首先判断问号前面的“操作数 1”的逻辑值是真还是假,如果逻辑值为真,则条件运算表达式的值等于“操作数 2”
的执行结果值;如果为假,则条件运算表达式的值等于“操作数 3”的执行结果值。
( 6) 位运算符位运算符用于对操作数进行的位操作,位运算符主要包括按位与,按位或,按位异或,
按位取反,左移和右移操作。在这些运算符中,
除按位取反运算符是一元运算符外,其他的都是二元运算符。位运算符的操作数只能为整型或字符型,不能为实型数据。
2,表达式
C#语言中的表达式类似于数学运算中表达式,它是操作符、操作对象和标点符号等连接而成的式子。
四,流程控制
1.条件语句
if语句是最常用的选择语句,它根据布尔表达式的值来判断是否执行后面的内嵌语句。
其格式为:
if(条件表达式)
{ 语句组; }
else
{ 语句组; };
2,Switch语句如果要实现多种选择的功能,那么可以采用 Switch语句。 Switch语句根据一个控制表达式的值选择一个内嵌语句分支来执行。它的一般格式为:
switch(条件表达式)
{
case 表达式 1:
语句 ;
……
default;
语句 ;
}
3,While语句
While语句有条件地将内嵌语句执行 0遍或若干遍。
其格式为:
while (条件表达式)
{
语句组;
}
4,do-while语句
do-while语句与 while语句不同的是,它将内嵌语句执行一次(至少一次)或若干次。
其格式为:
do
{
语句组;
}
while(条件表达式)
5,for语句
for语句是 C#中使用频率最高的循环语句。
在事先知道循环次数的情况下,使用 for语句是比较方便的。其格式为:
for(初始化 ;循环控制条件 ;改变控制变量 )
{
循环语句;
}
6,foreach语句
foreach语句是在 C#中新引入的。它表示收集一个集合中的各元素,并针对各个元素执行内嵌语句。其格式为:
foreach(循环变量 in 集合) {
语句组;
}
每执行一次内嵌语句,循环变量就依次取集合中的一个元素代入其中。在这里,循环变量只是一个只读型局部变量,如果试图改变它的值,将引发编译错误。
7,跳转语句
( 1) break语句和 continue语句
break语句用来退出最近的 switch,while、
do,for,foreach语句的循环,而 continue语句用来开始一个新的 while,do,for和 foreach
语句的循环。
( 2)标签声明和 goto声明标签声明可以交替声明,goto声明可以把控制传送到标签声明。
( 3) return语句
return语句返回对语句中的成员控制。
第二部分 面向对象程序设计一,C#面向对象程序设计基础面向对象编程主要思想是将数据(数据成员)
及处理这些数据的相应函数(函数成员)封装到类中,使用类的变量则称为对象。在对象内,只有属于该对象的函数成员才可以存取该对象的数据成员。这样,其他的函数就不会无意中破坏其内容,从而达到保护和隐藏数据的效果。
与传统的面向过程的编程方法相比,面向对象编程方法有 3 个优点:
( 1)程序的可维护性好;
( 2)程序容易修改;
( 3)对象可以使用多次,可重用性好。
二,类的基本概念
1.对象
1).对象的定义 (现实世界 )
1.某种确实存在的、可以被感官察觉到的物质;
2.思想、感觉或行为指向的某种精神或物质的东西。
2).软件对象的定义软件对象指的是将数据(状态)和功能(行为)捆绑为一体的软件结构,合在一起代表现实世界(包括物理的和概念的)对象的一个抽象;
3).另一种对象的定义(程序设计中)
是面向对象的程序设计模式,它由描述状态的变量和用来实现对象行为的方法组成。
2.对象的三要素,属性、方法、事件
2.对象的属性在对象术语中,被用来描述对象的数据元素被称为该对象的属性。
例如:
a.描述学生对象的数据元素如下,
学生姓名、学生 ID号、出生年月、住址、专业、平均成绩、专业导师姓名、本学期课程清单、成绩单。
b.描述课程对象的数据元素如下,
课程代号、课程名称、课程总学时、选课前必须结业的课程清单、可讲授该课程的教师清单。
4.类类是一组具有共同特性的所有对象成员的抽象描述,一个类的定义如下:
1.定义一个属于该类的对象所需要的数据结构(属性的名称和类型)
2.这种对象所执行的操作(方法)。包括这些操作的名称,属于该类的对象如何被形式的调用以执行这些操作,以及对象执行这些操作要在后台做哪些事情。
例如:学生类( 9个属性 +4个方法)
需要搞清楚的几个问题:
一、类和对象的关系类是若干具有共同相关属性的集合,对象是这些集合里面的某一个元素。
二、为什么要研究类类是一个集合,更具体的说,是一个具备特定功能的集合,当我们需要使用这个集合当中的任何一个元素的时候,都可以通过访问这个类来实现相关功能,
即 创建这个类的一个具体的实例三、如何在类和对象之间建立联系当需要使用某一个类当中的某一个对象的时候,需要创建这个类的一个具体的实例,
具体格式为类名 对象名 =new 类名()
例如:
student std=new student()
当这个具体的对象 std被创建出来后,则 std
就具备了 student这个的类的所有的属性、
方法、事件。
面向对象的三个特点一、继承任何一个类都可以从另一个类中继承,这个类拥有它继承的类的所有成员,被继承的类称为父类。
子类不仅具有父类所有的成员特征,同时还可以具备它本身的一些独有特性。
二、封装把公共的方法和属性组合起来,从而封装特定功能的一个集合(接口),类可以支持接口所指定的所有属性和成员。
三、多态性一个事物具备多种形态,通过继承,一个类可以用做多种类型:可以用做它自己的类型,任何基类型,或者在实现接口时有做任何接口类型。
创建类的一般步骤一、创建类名修饰符 类名
{
}
修饰符,public,private等等注意:类名不要和关键字相同!
二、声明字段修饰符 数据类型 字段名;
说明:
1、字段实际为属性名和属性植之间的一个中间变量,用来将属性植传递给属性名。
2、字段的数据类型一定要属性的数据类型保持一致。
3、字段一般用小写。
三、声明属性格式:
修饰符 数据类型 属性名;
{
get {return 字段名; }
set{字段名 =value; }
}
说明:
get访问器用来控制属性的读属性,set访问器用来控制属性的写属性,同时带有 get
和 set访问器的成为读写属性,省略 get部分称为只写属性,省略 set部分称为只读属性。
四、声明方法格式:
修饰符 数据类型 方法名()
{
方法体;
}
五、构造函数类名 对象名 =new 类名();
六、析构函数可省略不写。
构造函数构造函数是一种特殊的方法,无论在任何时候创建类的实例时,总可以调用这些方法,保证对象在被使用之前经过合适的初始化过程。
分类:
默认构造函数(省略不写)
实例构造函数实例构造函数又分为默认实例构造函数 public 类名();
实例构造函数
public 类名 (参数)
{
字段(属性) =形参;
}
析构函数用来销毁一个类的对象。
格式,~类名();
一般情况下可省略不写!
C#中提供了很多标准的类,用户在开发过程中可以使用这些类,C#中也可以自己定义类,方法如下:
[类修饰符 ] class 类名 [:父类名 ]
{
[成员修饰符 ] 类的成员变量或者成员函数 ;
};
其中,“类名”是自定义类的名字,该名字要符合标识符的要求。“父类名”表示从哪个类继承。如果没有父类名,则默认从 Object类继承而来。 Object类是每个类的祖先类,C#中所有的类都是从 Object类派生出来的。
“类修饰符”用于对类进行修饰,说明类的特性。
1.类的访问修饰符类的成员分为两大类:本身声明的成员和继承来的成员。类的成员使用不同的访问修饰符,定义成员的访问级别。从级别来划分类的成员可以为,公有成员 (public)、私有成员 (private)、
保护成员 (protected)和内部成员 (internal)。
公有成员允许类的使用者从外部进行访问;私有成员只有该类的成员可以访问,类外部是不能访问的。保护成员允许派生类访问,但对外部是隐藏的。内部成员是一种特殊的成员,这种成员对同一包中的应用程序或库是可以访问的,包之外不能访问。
四,对象的创建要创建一个类的对象,需要使用该类的构造函数。
1.构造函数构造函数用于执行类的实例的初始化。每个类都有构造函数,即使没有声明它,编译器也会自动提供一个默认的构造函数。在访问一个类的时候,系统将最先执行构造函数中的语句。
使用构造函数请注意以下几个问题:
( 1)一个类的构造函数通常与类名相同。
( 2)构造函数不声明返回类型。
( 3)构造函数总是 public 类型的。
构造函数是当这个类被创建的时候被调用。
2,创建一个对象方法,new 构造函数 ;
使用 new 语句调用构造函数创建一个对象。
五,继承为了提高软件模块的可重用性和可扩充性,
以便提高软件的开发效率,希望能够利 用前人或自己以前的开发成果,任何面向对象的程序设计语言都能够提供两个重要的特 性:
继承性和多态性。
现实世界中的许多实体之间不是相互孤立的,他们往往具有共同的特征,也存在内在的差别,人们就采用层次结构来描述这些实体之间的相似之处和不同之处。如交通工具的继承关系如下图:
交通工具海上交通工具 陆地交通工具 空中交通工具快艇 客轮 燃油 人力 飞艇 客机卡车 轿车 自行车 三轮车继承的语法结构,
[修饰符] 子类名,父类名 {
子类增加或修改的属性和方法 ;
}
注意,
1)子类继承了父类中除私有成员外的所有属性和方法 ;
2)子类继承父类中除构造函数和析构函数外的所有成员.
五,函数的重载函数重载的定义是:函数名称一样,但是函数的参数列表类型不一样。参数类型一样,返回类型不同的函数,不构成重载。可以重载普通的类的方法,也可以重载构造函数。
在调用重载的方法时系统会根据函数的参数的类型,分别调用不同的同名函数。
具体的使用方法见举例。