Download presentation
Presentation is loading. Please wait.
1
补充:c#语言基础
2
本章要点: 了解C#语言特点和编程规范 了解常用.NET命名空间 熟悉C#基础语法、流程控制 能创建简单的类
3
3.1 C#概述 C#是Microsoft专门为.NET量身打造的一种全新的编程语言。
C#的类型即.NET Framework所提供的类型,并直接使用.NET Framework所提供的类库。 ASP.NET 3.5本身就采用C#语言开发,所以C#不仅非常适用于Web应用程序的开发。
4
典型特点 C#代码在.NET Framework提供的环境下运行,不允许直接操作内存,增强了程序 的安全性。 使用C#能构建健壮的应用程序。
统一的类型系统。所有C#类型都继承于一个唯一的根类型object。因此,所有类型都共享一组通用操作。 完全支持组件编程。
5
3.2 Framework命名空间 命名空间用于组织.NET Framework提供的几千个类。
作为组织类的逻辑单元,命名空间即成了应用程序的内部组织形式,也成了应用程序的外部组织形式。 使用命名空间可以解决类名冲突问题。
6
3.2 Framework命名空间(续) 利用using语句使用命名空间,如“using system;”表示导入system命名空间。
导入命名空间后使得要访问包含的类时可省略命名空间。例如,若没有使用“using system;”语句,则“string strNum = "100";”这个语句就会出现编译错误,此时就应该用“System.String strNum = "100";”代替。
7
常用命名空间 System:提供基本类,如提供字符串操作的String类。
System.Configuration:提供处理配置文件中数据的类。 System.Data:提供对ADO.NET类的访问,如提供数据缓存的DataSet类。 System.Linq:提供使用LINQ进行查询的类和接口,如包含标准查询运算符的Queryable类。
8
ASP.NET 3.5页面的常用命名空间(续) System.Web:提供使浏览器与服务器相互通信的类和接口,如用于读取客户端信息的HttpRequest类。 System.Web.Security:提供在Web服务器实现ASP.NET安全性的类,如用于验证用户凭据的MemberShip类。 System.Web.UI:提供用于创建ASP.NET网站用户界面的类和接口,如每个Web窗体都继承的Page类。
9
ASP.NET 3.5页面的常用命名空间(续) System.Web.UI.HtmlControls:
System.Web.UI.WebControls: System.Web.UI.WebControls.WebParts:提供用于创建个性化Web部件页的类和接口,如呈现模块化用户界面的Part类。 System.Xml.Linq:提供用于LINQ to XML的类,如获取XML元素的Xelement类。
10
3.3 编程规范 良好的编程规范能极大的提高程序的可读性。 程序注释 命名规则
11
3.3.1 程序注释 代码间多行注释为“/* … */”,单行注释采用“// …”。 类、方法、属性、接口的注释采用XML文档格式注释。
程序注释 代码间多行注释为“/* … */”,单行注释采用“// …”。 类、方法、属性、接口的注释采用XML文档格式注释。 在{ }中包含较多代码行的结束处应加注释,便于阅读。 对分支语句(条件分支、循环语句等)必须编写注释。
12
3.3.2 命名规则 Pascal形式:指将标识符的首字母和后面连接的每个单词的首字母都大写,如BackColor。
命名规则 Pascal形式:指将标识符的首字母和后面连接的每个单词的首字母都大写,如BackColor。 Camel形式:指标识符的首字母小写,而每个后面连接的单词的首字母都大写,如backColor。
13
常用标识符的大小写方式对应表 标识符 方式 示例 标识符 方式 示例 类 Pascal AppDomain 接口 Pascal
IDisposable 枚举类型 Pascal ErrorLevel 方法 Pascal ToString 枚举值 Pascal FatalError 命名空间 Pascal System.Drawing 事件 Pascal ValueChanged 参数 Camel typeName 异常类 Pascal WebException 属性 Pascal BackColor 只读的静态字段 Pascal RedValue 变量名 Camel dateConnection
14
命名的其它规则 常量名都要使用大写字母, 用下划线“_”分割单词。 除局部循环变量外,一般变量名不得取单个字符。
类的成员变量(属性所对应的变量)使用前缀“_”。 接口命名在名字前加上“I”前缀,如IDisposable。
15
常用控件名简写对照表 控件名 简写 Label lbl TextBox txt RadioButton rdo Button btn
LinkButton lnkbtn Image img ImageButton imgbtn DropDownList ddl RangeValidator rv ListBox lst DataGrid dg RequiredFieldValidator rfv DataList dl CheckBox chk CompareValidator cv CheckBoxList chkls AdRotator ar ValidatorSummary vs RadioButtonList rdolt Table tbl RegularExpressionValidator rev Panel pnl Calender cld
16
3.4 常量与变量 常量声明 变量声明 修饰符 局部变量作用范围
17
3.4.1 常量声明 常量具有在编译时值保持不变的特性,声明时使用const关键字,同时必须初始化。
常量声明 常量具有在编译时值保持不变的特性,声明时使用const关键字,同时必须初始化。 常量用易于理解的名称替代了“含义不明确的数字或字符串”,使程序更易于阅读。 常量使程序更易于修改。 常量的访问修饰符有public、internal、protected internal和private等。
18
3.4.2 变量声明 变量在程序运行过程中值可以变化,必须先声明再使用。
变量声明 变量在程序运行过程中值可以变化,必须先声明再使用。 变量名长度任意,可以由数字、字母、下划线等组成,但第一个字符必须是字母或下划线。 C#是区分大小写的,因此“strName”和“strname”代表不同的变量。
19
变量声明(续) 变量的修饰符有 public、internal、protected、protected internal、private、static和readonly,C#中将具有这些修改符的变量称为字段,而把方法中定义的变量称为局部变量。 注意:局部变量前不能添加public、internal、protected、protected internal、private、static和readonly等修饰符。
20
3.4.3 修饰符 访问修饰符 public:访问不受限制,任何地方都可访问。 internal:在当前程序中能被访问。
修饰符 访问修饰符 public:访问不受限制,任何地方都可访问。 internal:在当前程序中能被访问。 protected:在所属的类或派生类中能被访问。 protected internal:在当前的程序或派生类中能被访问。 private:在所属的类中能被访问。
21
修饰符(续) static 使用static声明的变量称静态变量,又称为静态字段。对于类中的静态字段,在使用时即使创建了多个类的实例,都仅对应一个实例副本。访问静态字段时只能通过类直接访问,而不能通过类的实例来访问。 readonly
22
局部变量作用范围 块级:作用域范围最小的变量,如包含在if、while等语句段中的变量。这种变量仅在块内有效,在块结束后即被删除。 方法级:作用于声明变量的方法中,在方法外即不能访问。 对象级:作用于定义类的所有方法中,只有相应的ASP.NET页面结束时才被删除。
23
3.5 数据类型 C#数据类型有值类型和引用类型两种。 值类型的变量直接包含它们的数据,而引用类型存储对它们的数据的引用。
3.5 数据类型 C#数据类型有值类型和引用类型两种。 值类型的变量直接包含它们的数据,而引用类型存储对它们的数据的引用。 对于值类型,一个变量的操作不会影响另一个变量;而对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能会影响到另一个变量。
24
值类型 简单类型:整数类型、布尔类型、字符类型和实数类型。 结构类型 枚举类型
25
布尔类型 布尔类型表示“真”和“假”,用“true”和“false”表示。 注意:布尔类型不能用整数类型代替,如数字0不能代替false。
26
字符类型 字符类型采用Unicode字符集标准,一个字符长度为16位。 字符类型的赋值形式:
char x1='A'; // 一般方式,值为字符A char x2='中'; //值为汉字“中” char x3='\x0041'; // 十六进制方式 char x4='\u0041'; //Unicode方式 char x5='\''; //转义符方式 注意:char类型变量声明时必须包含在一对单引号中。
27
常用转义符对应表 转义符 对应字符 \' 单引号 \a 感叹号 \" 双引号 \n 换行 \\ 反斜杠 \r 回车 \0 空字符 \b 退格
28
实数类型 单精度float类型:常用于科学计算 双精度double类型:常用于科学计算 十进制decimal类型:常用于金融计算
注意:float类型必须在数据后添加“F”或“f”,decimal类型必须添加“M”或“m”,否则编译器以double类型处理。
29
结构类型 public struct StudentInfo { public string Name;
public string phone; public string Address; } StudentInfo stStudent; // stStudent为一个StudentInfo结构类型变量
30
枚举类型 枚举类型是由一组命名常量组成的类型,使用enum关键字声明。
枚举中每个元素默认是整数类型,且第一个值为0,后面每个连续的元素依次加1递增。若要改变默认起始值0,可以通过直接给第一个元素赋值的方法。 枚举类型的变量在某一时刻只能取枚举中某一元素的值。
31
实例3-1 枚举类型变量应用 本实例首先定义枚举类型Color,再声明enTest枚举变量,最后以两种形式输出enTest值。
实例3-1 枚举类型变量应用 本实例首先定义枚举类型Color,再声明enTest枚举变量,最后以两种形式输出enTest值。 源程序:enum.aspx
32
引用类型 class类型 接口类型 数组类型 委托类型
33
object类型 作为class类型之一的object类型,实质是System.Object类的别名。
34
string类型 实质是一种数组,即字符串可看作是一个字符数组。 在声明时要求放在一对双引号之间 。 两种包含转义符的字符串形式
string strPath = "c:\\ASP\\default.aspx"; string strPath []运算符可访问字符串中各个字符,如: string strTest = "abcdefg"; char x = strTest[2]; //x的值为'c'
35
string类型(续) 通过ToString() 转化为string类型 string strInt = 23.ToString();
使用Parse()方法或Convert类的相应方法转化为其它类型 int iString = Int32.Parse("1234"); string strDatetime = Convert.ToString(DateTime.Now);
36
接口类型 接口常用来描述组件对外能提供的服务。 接口中不能定义数据,只能定义方法、属性、事件等。
包含在接口中的方法不定义具体实现,而是在接口的继承类中实现。
37
数组类型 数组是一组数据类型相同的元素集合。 要访问数组中的元素时,可以通过“数组名[下标]”形式获取,其中下标编号从0开始。
数组可以是一维的,也可以是多维的。 string[] s1; int[] s2 = new int[] { 1, 2, 3 }; int[,] s3 = new int[,] { { 1, 2}, { 4, 5} };
38
委托类型 委托是一种安全地封装方法的类型,类似于C和C++中的函数指针。与C中的函数指针不同,委托是类型安全的。
通过委托可以将方法作为参数或变量使用。
39
3.5.3 装箱和拆箱 装箱和拆箱是实现值类型和引用类型相互转换的桥梁。
装箱和拆箱 装箱和拆箱是实现值类型和引用类型相互转换的桥梁。 装箱的核心是把值类型转化为对象类型,也就是创建一个对象并把值赋给对象。 int i = 100; object objNum = i; //装箱
40
3.5.3 装箱和拆箱(续) 拆箱的核心是把对象类型转换为值类型,即把值从对象实例中复制出来。 int i = 100;
装箱和拆箱(续) 拆箱的核心是把对象类型转换为值类型,即把值从对象实例中复制出来。 int i = 100; object objNum = i; //装箱 int j = (int)objNum; //拆箱
41
3.6 运算符 请参考教材中的表3-7
42
3.7 流程控制 选择结构 循环结构
43
3.7.1 选择结构 If语句 注意:条件表达式在判断是否相等时一定要用“==”。 switch语句
选择结构 If语句 注意:条件表达式在判断是否相等时一定要用“==”。 switch语句 注意:每一个case块的结束必须有break结束语句或goto跳转语句。
44
实例3-2 switch语句应用 本实例根据今天是星期几在页面上输出相应信息。 源程序:switch.aspx
45
循环结构 while语句 根据条件表达式的值,执行0次或多次循环体。
46
实例3-3 while语句应用 本实例在页面上的TextBox中输入一个值n,单击Button按钮后计算“S=1+3+…+n”,并在一个Label控件中输出值。 源程序:while.aspx
47
3.7.2 循环结构(续) do-while 循环 for语句
循环结构(续) do-while 循环 注意:与while语句不同,do-while循环体内语句序列会在计算条件表达式之前执行一次。 for语句 for语句较适用于循环次数已知的循环,循环体中语句可能执行0次或多次。 注意:当使用for (; ;)形式时表示死循环,需要break语句跳出。
48
实例3-4 for语句应用 本实例利用for语句在网页上输出三角形。 源程序:for.aspx
49
3.7.2 循环结构(续) foreach语句 foreach语句常用于枚举数组、集合中每个元素,并针对每个元素执行循环体内语句序列。
循环结构(续) foreach语句 foreach语句常用于枚举数组、集合中每个元素,并针对每个元素执行循环体内语句序列。 foreach语句不能改变集合中各元素的值。foreach (数据类型 循环变量 in 集合) { //语句序列 }
50
实例3-5 foreach语句应用 本实例先给数组赋值,再逐个输出数组元素。 源程序:foreach.aspx
51
3.7.3 异常处理 异常的产生常由于激发了某个异常的条件,使得操作无法正常进行,如算术运算中的除零操作、内存不足、数组索引越界等。
异常处理 异常的产生常由于激发了某个异常的条件,使得操作无法正常进行,如算术运算中的除零操作、内存不足、数组索引越界等。 异常处理能使程序更加健壮,容易让程序员对捕获的错误进行处理。 异常处理常使用两种形式:throw语句和try…catch…finally结构。
52
throw语句 throw语句用于抛出异常错误信息。
53
实例3-6 throw语句应用 本实例当除零操作时,抛出“除数不能为零!”的错误信息。 源程序:throw.aspx 程序说明:
54
try…catch…finally结构 异常捕获由try块完成,处理异常的代码放在catch块,而在finally块中的代码不论是否有异常发生总会被执行。 catch块可多个,而finally块不是必需的。 在实际应用中,finally常完成一些善后工作,如数据库操作中的数据库关闭等。
55
try…catch…finally结构(续)
{ //可能出错的语句序列 } catch (异常声明1) //捕获异常后执行的语句序列 catch (异常声明2) … finally //总是执行的语句块
56
实例3-7 try…catch…finally结构应用
exceptionNo.aspx.cs未包含try…catch…finally结构,浏览exceptionNo.aspx时因为找不到“E:\ASP.NET\MyPet.mdf”数据库而给出系统报错信息。 exception.aspx.cs中包含了try…catch…finally结构,当try块执行出错时将执行catch块,浏览exception.aspx时显示系统错误信息和开发人员定义的出错信息。 源程序:exceptionNo.aspx 源程序:exception.aspx
57
3.8 自定义ASP.NET类 ASP.NET 3.5是完全面向对象的,任何对象都由类生成,而自定义类能进一步扩展功能。
58
3.8.1 类的常识 类具有封装性、继承性和多态性的特点。 与ASP.NET 3.5页面对应的类包含在.aspx.cs文件中。
类的常识 类具有封装性、继承性和多态性的特点。 与ASP.NET 3.5页面对应的类包含在.aspx.cs文件中。 自定义的类应该放在App_Code文件夹下,Visual Studio 2008会自动编译该文件夹中包含的类,并且在使用这些类时能得Intellisense的支持。
59
3.8.1 类的常识(续) 类创建完后,使用new关键字可建立类的实例对象。
类的常识(续) 类创建完后,使用new关键字可建立类的实例对象。 类的常用修饰符主要有访问修饰符、abstract、static、partial、sealed。
60
3.8.1 类的常识(续) abstract 修饰符表示该类只能是其他类的基类,又称为抽象类,对这种类中的成员必须通过继承来实现。
类的常识(续) abstract 修饰符表示该类只能是其他类的基类,又称为抽象类,对这种类中的成员必须通过继承来实现。 static修饰符表示该类为静态类,这种类在使用时不能使用new创建类的实例,但能够直接访问数据和方法。
61
类的常识(续) partial修饰符可以将类的定义拆分到两个或多个源文件中。每个源文件包含定义的一部分,当编译应用程序时.NET Framework会将所有部分组合起来形成一个类。 sealed修饰符表示该类为密封类,意味着该类不能被继承。
62
3.8.2 属性 可以获取或改变类中私有字段的内容,这种方式充分地体现了封装性,即不直接操作类的数据内容,而是通过访问器进行访问。
属性 可以获取或改变类中私有字段的内容,这种方式充分地体现了封装性,即不直接操作类的数据内容,而是通过访问器进行访问。 访问器有get访问器和set访问器,分别用于获取和设置属性值。 当仅包含get访问器时,表示该属性是只读的。
63
实例3-8 类Account的属性定义 本实例描述类Account中的三个属性:帐户编号(ID)、帐户所有者(Name)、帐户余额(Balance)。 源程序:Account.cs
64
3.8.3 构造函数 当使用new关键字实例化一个对象时,将调用对象的构造函数,所以说,在使用一个类时,最先执行的语句就是构造函数中的语句。
构造函数 当使用new关键字实例化一个对象时,将调用对象的构造函数,所以说,在使用一个类时,最先执行的语句就是构造函数中的语句。 每个类都有构造函数,如果没有定义构造函数,编译器会自动提供一个默认的构造函数。 注意:构造函数名与类名相同且总是public类型。
65
实例3-9 类Accout中构造函数定义 在银行帐户类Accout中,需要构建一个对应的构造函数。 源程序:Account.cs 程序说明:
如建立对象时使用 Account account = new Account("324001", "李明", 140); 这表示"324001"值传给属性ID,再通过set访问器设置_ID的值为"324001"。类似地,另两个参数值"李明"和140也分别传递给对象中的_Name和_Balance。
66
方法 方法反映了对象的行为。 方法的常用修饰符有访问修饰符、void等。 void指定方法不返回值。
67
实例3-10 类Account中存款和取款方法定义
存款方法先检查需存款的金额是否大于0,若大于0则将原帐户余额与存款金额相加保存为新的存款金额,否则抛出异常信息。 取款方法先检查取款金额是否小于原帐户余额,若是则将原帐户余额减去取款金额,再保存为新的存款金额,否则抛出异常。 源程序:Account.cs
68
实例3-11 Account类和ASP.NET网页结合
源程序:Account.aspx 程序说明: new Account("03401", "李明", 200)调用构造函数Account()创建实例对象。 account.Balance.ToString()获取account对象的Balance属性值,并转化为string类型数据。 account.Deposit(100)表示调用account对象的Deposit方法。
69
3.8.5 事件 事件是一种用于类和类之间传递消息或触发新的行为的编程方式。
事件 事件是一种用于类和类之间传递消息或触发新的行为的编程方式。 事件的声明通过委托来实现。先定义委托,再用委托定义事件,激发事件的过程实质是调用委托。 public delegate void EventHandler(object sender, EventArgs e); //定义委托 public event EventHandler MyEvent; //定义事件
70
实例3-12 类AccountEvent中增加余额不足事件和事件应用
本实例在类Account基础上新建一个类AccountEvent,定义的事件将在取款余额不足时触发。 源程序:AccountEvent.cs 源程序:AcountEvent.aspx
71
事件应用归纳 在类中定义事件 在类的某个方法中增加事件触发点 在类的实例对象中注册事件 编写事件触发代码
72
3.8.6 继承 继承可以重用现有类的数据和行为,并扩展新的功能。 继承以基类为基础,通过向基类添加成员创建派生类。
继承 继承可以重用现有类的数据和行为,并扩展新的功能。 继承以基类为基础,通过向基类添加成员创建派生类。 通常基类又称为超类或父类,派生类又称为子类。
73
实例3-13 继承的实现 本实例建立的EnterpriseAccount类在继承Account类的基础上增加了Type属性。
实例3-13 继承的实现 本实例建立的EnterpriseAccount类在继承Account类的基础上增加了Type属性。 源程序:EnterpriseAccount.cs
74
3.9 小结 良好的编程规范是开发人员应当遵守的规则,这有助于代码理解、方便代码阅读。
3.9 小结 良好的编程规范是开发人员应当遵守的规则,这有助于代码理解、方便代码阅读。 掌握C#基础语法是ASP.NET 3.5网页开发的基础。 在编程时要树立绝大部分的业务处理都通过自定义类实现的思想,这实际上也是N层应用程序的编程思想。
Similar presentations