WEB案例开发第3章-C#基础课件_第1页
WEB案例开发第3章-C#基础课件_第2页
WEB案例开发第3章-C#基础课件_第3页
WEB案例开发第3章-C#基础课件_第4页
WEB案例开发第3章-C#基础课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第3章C#基础

第3章C#基础

1学习目的与要求如果要深入到ASP.NET3.5应用程序开发,需要对开发语言有更加深入的了解。而在.NET平台上,微软主推的编程语言就是C#,本章将会从C#的语法、结构和特性来讲解,以便读者能够深入的了解C#程序设计。这部分是程序设计的基本知识和技巧,应该牢固掌握。通过本章的学习你将能够:掌握C#语言的基本知识,包括变量、变量规则、表达式、条件语句、循环语句以及异常处理。掌握C#中面向概念的特性,包括类、对象、封装、继承、多态、委托和事件等。学习目的与要求如果要深入到ASP.NET3.5应用程序开发2本章主要内容C#语言的基本知识:包括变量、变量规则、表达式、条件语句、循环语句以及异常处理。C#中面向概念的特性:包括类、对象、封装、继承、多态、委托和事件等。本章主要内容C#语言的基本知识:包括变量、变量规则、表达式、33.1C#程序的基本结构//"HelloWorld!"programinC#usingSystem;namespaceAscent{classHello{//变量

staticstrings="HelloWorld!";//方法

staticvoidMain(){System.Console.WriteLine(s);}}}3.1C#程序的基本结构//"HelloWorld!43.1C#程序的基本结构1.注释2.using语句3.命名空间(namespace)4.C#程序的基本元素C#程序由类、程序块、分隔符、标识符、关键字、变量、方法和C#类库等组成。3.1C#程序的基本结构1.注释53.2C#面向对象技术所谓面向对象的方法学,就是使我们分析、设计和实现一个系统的方法尽可能地接近我们在实际生活中认识一个系统的方法。它包括:面向对象的分析(OOA,Object-OrientedAnalysis)、面向对象的设计(OOD,Object-OrientedDesign)、面向对象的程序设计(OOP,Object-OrientedProgram)。3.2C#面向对象技术所谓面向对象的方法学,就是使我们分61.对象对象有两个层次的概念,现实生活中对象指的是可观世界的实体或事物;而程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。变量方法我们可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型(与基本数据类型对应)来描述的,这种抽象数据类型称为类(Class).

1.对象对象有两个层次的概念,现实生活中对象指的是可观世界72.类(Class)类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。相似的对象可以归并到同一个类中去,就像传统语言中的变量与类型关系一样。程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。它的基本概念有:变量:指对象的所知道的状态。方法:指对象的功能单元。对象B对象A消息消息:软件对象通过传递消息来相互作用和通信,一个消息有三部分组成:接受消息的对象、接收对象要采取的方法、方法需要的参数。2.类(Class)类是描述对象的“基本原型”,它定义一类83.类、方法和变量在类中,数据或变量被称为实例变量(instancevariables),代码包含在方法(methods)内。定义在类中的方法和实例变量被称为类的成员(members)。在大多数类中,实例变量被定义在该类中的方法操作和存取。这样,方法决定该类中的数据如何使用。(1)类的定义及修饰字基本语法如下:[类的修饰字]class类名称[:基类或接口]{

变量定义及初始化;方法定义及方法体;}其中[]内的内容代表是可选的。3.类、方法和变量在类中,数据或变量被称为实例变量(ins9如果类不是在某个类内声明的(将在后面讲解),这个类又叫顶级类,它的修饰字包括public和internal两种。public所修饰的类的可访问域是任何引用该程序的程序,访问不受限制。internal所修饰的类的可访问域是定义它的程序。当类没有指定修饰符时,默认的修饰符是internal。类名是必须的,它是一种标识符,必须符合标识符的命名规则。类名最好能体现类的含义和用途。基类或接口是和继承相关的概念,将在后面详细介绍。如果类不是在某个类内声明的(将在后面讲解),这个类又叫顶级类10(2)成员变量的定义及修饰字基本语法如下:[变量修饰字]变量数据类型变量名1,变量名2[=变量初值]…;变量修饰字包括访问修饰符和其他修饰字(例如const用来修饰常量)。对类的成员变量和成员方法而言,其应用范围可以通过一定的访问权限来限定,类成员访问权限如表所示。(2)成员变量的定义及修饰字11WEB案例开发第3章--C#基础课件12(3)方法的定义及修饰字基本语法如下:[方法修饰字]返回类型方法名称(参数1,参数2,…)[throwsexceptionList]{…(statements;)//方法体:方法的内容}方法修饰字包括访问修饰符(同上面成员变量的访问修饰符一样)和其他修饰字(例如static用来修饰静态方法)。返回类型可以是任意的C#数据类型,当一个方法不需要返回值时,返回类型为void。参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口)。throwsexceptionList是和异常处理(将在后面详细讲解)相关的,可以保证程序的健壮性。方法体是对方法的实现。它包括局部变量的声明以及所有合法的C#指令。局部变量的作用域只在该方法内部。(3)方法的定义及修饰字13(4)方法参数方法既可以有参数,也可以不带参数。如果有参数,则定义在其形式化参数表内,如果不止一个参数,则参数之间须用逗号分隔。方法为其所声明的参数和局部变量创建了单独的声明空间。方法的形参表和在方法体中的局部变量声明把它们所声明的名称提供给此声明空间。如果方法声明空间的两个成员具有相同的名称,或者方法声明空间积嵌套的声明空间的局部变量声明空间包含同名的元素,则会发生错误。(4)方法参数14(5)构造方法和析构方法构造方法(Constructor)是一种特殊的方法。C#中的每个类都有构造方法,用来初始化该类的一个新的对象。构造方法具有和类名相同的名称,而且不返回任何数据类型。系统在产生对象时会自动执行。如果程序中没有定义构造方法,C#会自动生成一个缺省构造方法,它是一个无参数的空方法。但是特别要注意的是,如果程序中已经定义了构造方法,C#就不会再生成缺省构造方法了。(5)构造方法和析构方法15(6)方法的重载方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。在以前不支持方法重载的语言中(例如C语言),每个方法必须有一个唯一的名字。但是,你经常希望实现数据类型不同但本质上相同的方法。例如,要打印不同类型的数据,int,float,String,C语言需要定义不同名的方法:PrintInt(int);PrintFloat(float);PrintString(String)。这样就使得概念情况复杂许多。尽管每一个打印方法潜在的概念是相同的,你仍然不得不记住这三个名字。在C#中就不会发生这种情况,我们可以使用方法重载这个概念,只需要定义一个方法名:Println(),接收不同的参数:Println(int);Println(float);Println(String);重载的价值在于它允许相关的方法可以使用同一个名字来访问。因此,Println这个名字代表了它执行的通用动作(generalaction)。为特定环境选择正确的指定(specific)版本是编译器要做的事情。作为程序员只需要记住执行的通用操作就行了。(6)方法的重载163.2.2封装在C#中,就是通过类这样的机制来完成封装性。在创建一个类时,你实际上是在创建一种新的数据类型,不但要定义数据的属性,也要定义操作数据的代码,所以封装把对象的所有组成部分,包括数据和方法,组合在一起。同时,封装也提供另一个重要属性:访问控制(accesscontrol)。通过控制访问,可以阻止对象的滥用。也就是说,封装可以将类的数据隐藏起来,从而控制用户对类的修改和访问数据的程度。另外,方法定义了对该类数据相一致的控制接口。因此,你可以通过类的方法来使用类,而没有必要担心它的实现细节或在类的内部数据实际上是如何被管理的。在某种意义上,一个类像“一台数据引擎”。你可以通过操纵杆来控制使用引擎,而不需要知道引擎内是如何工作的。事实上,既然细节被隐蔽,当需要时,它的内部工作可以被改变。只要你的代码通过类的方法来使用它,内部的细节可以改变而不会对类的外部带来负面影响。3.2.2封装在C#中,就是通过类这样的机制来完成封装性173.2.3继承1.继承概念继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。继承而得到的类为子类,被继承的类为基类或父类。继承是子类利用父类中定义的方法和变量,就像它们属于子类本身一样。C#中不支持类之间的多重继承(注:C#支持接口之间的多重继承),即不允许一个子类继承多个父类。这是因为多重继承带来了许多必须处理的问题。多重继承只对编程人员有益,却增加了编译器和运行环境的负担。不要混淆的是,C#支持多层继承,也就是说,你可以如你所愿的建立包含任意多层继承的类层次。前面提到,用一个子类作为另一个类的超类是完全可以接受的。3.2.3继承1.继承概念182.虚方法与重写方法如果一个实例方法的声明中有virtual修饰符,那么这个方法为虚方法。如果一个实例方法的声明中有override修饰符,那么这个方法为重写方法(overridemethod),重写方法用相同的签名重写所继承的虚方法。在虚方法调用中,对象的运行时类型(run-timetype)确定了要被调用的究竟是方法的哪一个实现。只有在包含了override修饰符时,一个方法才能重写另一个方法。否则,声明一个从基类继承而来的具有相同签名的方法只会隐藏被继承的基类方法。重写方法允许通用类指定方法,这些方法对该类的所有派生类都是公用的,同时该方法允许子类定义这些方法中的某些或全部的特殊实现。2.虚方法与重写方法193.2.4多态1.多态概念多态是面向对象设计中代码重用的一个最强大的机制之一。多态从语义上讲是“多个结果”的意思。成功应用多态的关键部分是理解超类和子类形成了一个从简单到复杂类层次。正确应用多态,超类提供子类可以直接运用的所有元素。多态也定义了这些派生类必须自己实现的方法。这允许子类在加强一致接口的同时,灵活的定义它们自己的方法。这样,超类可以定义供它的所有子类使用的方法的通用形式。同时,在程序运行时,对超类通用方法的调用实际上转换为对子类自己实现的方法的调用,从而产生多个动态结果。3.2.4多态1.多态概念203.2.4多态2.多态实现条件多态实现有三个条件:(1)继承、虚方法和重写方法,这在前面刚刚讲解过。(2)子类对象声明基类类型(3)运行时类型(Run-TimeType)识别对于重写的方法,C#运行时系统根据调用该方法的实例的运行时类型来决定选择哪个方法调用。这是由系统支持的。3.2.4多态2.多态实现条件213.多态性的代码实现基本模板如下:(1)继承和方法重写SubC1:SuperCoverrideMethodA();SubC2:SuperCoverrideMethodA();SubC3:SuperCoverrideMethodA();(2)子类对象声明超类类型,这里我们使用数组SuperC[]sa={newSubC1(),newSubC2(),newSubC3()}(3)运行时类型识别foreach(SuperCscinsa){sc.MethodA();}3.多态性的代码实现基本模板如下:223.3C#高级技术上一节我们讲了面向对象的核心概念:封装、继承和多态。除此之外,面向对象技术还有一些高级特性,包括静态(static)变量和方法;密封(sealed)类和方法;访问规则(Accesscontrol);抽象类和方法(Abstractclassesandmethods);接口(Interface);集合;类的转换等等。这一章我们就来一一展开这些高级语法部分的讲解。3.3C#高级技术上一节我们讲了面向对象的核心概念:封装233.3.1静态变量和方法在类的变量或方法之前用static修饰,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。若无static修饰,则是实例方法和实例变量。1.静态(static)变量静态变量或类变量是一种全局变量,它可以在各对象实例间共享。3.3.1静态变量和方法242.静态(static)方法同样,static的方法相当于C语言中的全局函数,其他的类不用实例化即可调用它们。全局变量可以分为实例变量(instancevariable)和类变量(staticvariable)两种;同样方法也可以分为实例方法和静态方法(加static关键字的方法)两种。在方法使用变量时,我们需要注意以下规则:实例方法既可以使用实例变量,又可以使用类变量;而静态方法只能使用类变量,不能直接使用实例变量。2.静态(static)方法253.3.2密封类和方法sealed也是一个重要的关键字,它可以用来修饰类,变量和方法。sealed修饰符放在类之前,就将类声明为密封类,表示该类不能被继承。密封类主要防止意外的派生,同时可以提高程序的运行性能。在非密封类中,如果要防止一个实例成员在子类中被重写,可以将该成员声明为密封成员,包括密封方法,密封属性,密封索引器等。对于密封方法,它只能用于对基类的虚方法进行重写,并提供具体的实现。所以在密封方法的声明中,sealed修饰符总是和override修饰符同时使用,可以防止派生类进一步重写该方法。3.3.2密封类和方法sealed也是一个重要的关键字,263.3.3访问控制(Accesscontrol)前面我们介绍过,封装将数据和处理数据的代码组合起来。同时,封装也提供了另外一个重要属性:访问控制。通过封装你可以控制程序的某个部分可以访问类的成员,防止对象的滥用,从而保护对象中数据的完整性。对于所有的面向对象的语言,比如C++,访问控制都是一个很重要的方面。由于C#语言使用了命名空间的概念,使它的访问控制相对来说更复杂一些。我们把控制访问控制权限的修饰符主要分为两类,类和它的方法及变量,前面我们简单介绍过访问修饰符,这里我们再总结一下。3.3.3访问控制(Accesscontrol)前面我271.类的访问控制每个类都拥有自己的名字空间,即指类及其方法和变量可以在一定的范围内知道彼此的存在,可以使用。对类而言:public所修饰的类的可访问域是任何引用该程序的程序,访问不受限制。internal所修饰的类的可访问域是定义它的程序。2.类成员变量和成员方法的访问控制对类的成员变量和成员方法而言,其应用范围可以通过一定的访问权限来限定。Public,所有类均可以访问;private,只能被它所在的类内访问;protected,可以被类内和所有子类访问;internal,限定在类所在的程序内;protectedinternal,protected或者internal,即可访问域限定在类所在的程序或那些由它所属的类派生的类内。1.类的访问控制283.3.4抽象类与抽象方法在现实生活中我们发现,一个类中的某个或某几个方法是无法具体实现的。例如我们前面使用的Shape类中的画图draw()方法。当你不知道具体要画什么形状,比如长方形或者三角形时,你怎么可能实现一个画形状的方法呢?在C#中,这样的方法我们叫做抽象方法。一个类如果有一个或多个抽象方法,这个类就叫做抽象类。用abstract关键字来修饰一个类时,该类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。abstractReturnTypeabstractMethod([paramlist]);(1)抽象类必须被继承,抽象方法必须被重写。(2)抽象类不能被直接实例化。因此它一般作为其它类的基类。(3)抽象方法只需声明,而不需实现。定义了抽象方法的类必须是抽象类。3.3.4抽象类与抽象方法在现实生活中我们发现,一个类中293.3.5接口(interface)从本质上讲,接口是一种特殊的抽象类,这种抽象类中指定实现该接口的类必须提供的成员,实现接口的类提供接口成员的实现。那么我们为什么要使用接口?首先通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系;其次通过接口可以指明多个类需要实现的方法;最后通过接口可以了解对象的交互界面,而不需了解对象所对应的类。另外,从软件设计的角度来看,我们希望把复杂的应用系统分割成为多个模块,每个模块完成独立的功能,模块之间能够协同工作,这样的模块称为组件。组件可以单独开发、编译和测试,把所有组件结合在一起,就得到了完整的系统。要使组件能够协同工作,就必须在组件之间提供一种工作协议,而接口就非常适合作为组件之间的协议描述工具。3.3.5接口(interface)从本质上讲,接口是一301.接口的定义[接口修饰符]interfaceinterfaceName[:SuperInterfaceList]{……//接口成员}其中,接口修饰符是可选的,只允许new修饰符和访问修饰符public,protected,internal或private。基接口也是可选的,接口可以从零个或多个接口继承。interface和接口名是必须的,接口名是一种标识符,应符合标识符的命名规则,最好能体现接口的含义和用途。根据命名惯例,接口名总是以大写字母I开头。1.接口的定义[接口修饰符]interfaceinte31接口成员具有如下要求:接口成员必须是方法、属性、事件或索引器。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含类的静态成员。接口只包含方法、属性、事件或索引器的签名,而不提供它们的实现。接口成员都是public类型的,但是不能使用public修饰符。2.接口的实现在类中继承接口叫做对接口的实现(implementation)。接口成员具有如下要求:323.3.6集合(Collection)集合是C#中最常用、最重要的技术之一。集合是存放其它对象并且只能存放对象的对象,也可以叫容器。集合中的元素类型都为对象(Object)。从集合取得元素时,必须把它转换成原来的类型。另外,集合的大小是可以动态增减的,这是与我们前面介绍的数组不同的地方。集合是组合在一起的数据组。System.Collections命名空间中提供了大量的集合类和一系列接口,所有的集合类都实现了其中的一些接口。实现这些接口也可以设计出自定义的集合类。3.3.6集合(Collection)集合是C#中最常用331.集合与接口集合是一组组合在一起的类似的类型化对象。如果将紧密相关的数据组合到一个集合中,则能够更有效地处理这些紧密相关的数据。使用集合就能使用相同的代码来处理一个集合的所有元素,而不需要编写不同的代码来处理每一个单独的对象。集合的基本操作包括添加、移除和修改该集合中的个别元素或某一范围内的元素,也可以将整个集合复制到另一个集合中。集合是基于System.Collections.ICollection接口、System.Collections.IList接口、System.Collections.IDictionary接口来实现的。IList接口和IDictionary接口都是从ICollection接口派生的,因此,所有集合都直接或间接地实现了ICollection接口。对于基于IList接口的集合(如Array、ArrayList或List)或者直接基于ICollection接口的集合(如Queue、Stack或LinkedList类)来说,每个元素都只包含一个值。对于基于IDictionary接口的集合(Hashtable和SortedList类)来说,每个元素都包含一个键和一个值。1.集合与接口集合是一组组合在一起的类似的类型化对象。如果34下面是关于集合的几个重要概念:(1)容量和计数集合的容量是它可以包含的元素的数目。集合的计数是它实际包含的元素的数目。System.Collections命名空间中的所有集合在达到当前容量时都会自动扩充容量。内存被重新分配,元素从旧集合复制到新集合中。这减少了使用集合所需的代码,但是,集合的性能可能会受到消极影响,避免因多次重新分配而导致不佳性能的最佳方法是将初始容量设置为一个合理估计的大小。(2)下限集合的下限是其第一个元素的索引。System.Collections命名空间中的所有索引集合的下限均为零。下面是关于集合的几个重要概念:(1)容量和计数35下面是关于集合的几个重要概念:(3)同步同步在访问集合的元素时提供线程安全。默认情况下集合不是线程安全的。在System.Collections命名空间中只有几个类型提供synchronize方法,该方法能够保证集合是线程安全的。但是System.Collections命名空间中所有类都提供SyncRoot属性,可供派生类创建自己的线程安全类,另外这些类还提供了IsSynchronized属性以确定是否线程安全的。(4)列举器列举器用于循环访问集合的对象,可以看成是指向集合中任何元素的可移动的指针。一个列举器只能与一个集合关联,但一个集合可以具有多个列举器。C#的foreach语句使用列举器并隐藏了操作列举器的复杂性。下面是关于集合的几个重要概念:(3)同步362.foreach循环语句为了隐藏集合类型的内部实现方法,更有效地处理集合类型,c#定义foreach语句(前面简单介绍过一些),专门用于循环处理集合类型的元素。foreach用于循环列举一个集合的元素,并对该集合中的每个元素执行一次相关的嵌入语句。foreach语句的形式为:foreach([类型][迭代变量名]in[集合类型表达式]foreach语句的[类型]和[迭代变量名]声明该语句的迭代变量(iterationvariable)。迭代变量相当于一个范围覆盖整个嵌入语句的只读局部变量。在foreach语句执行期间,迭代变量表示当前正在为其执行迭代的集合元素。如果嵌入语句试图修改迭代变量(通过赋值或使用++或--运算符)或将迭代变量作为ref或out参数传递,都会发生编译时错误。foreach语句的[集合类型表达式]必须有一个从该集合的元素类型到迭代变量的类型的显式转换。如果集合类型表达式]的值为null,则会引发System.NullReferenceException异常。支持foreach语句的集合类型必须实现System.Collections..IEnumerable接口,或者实现集合模式(collectionpattern)C#语言中的foreach语句需要使用集合中元素的类型。由于Hashtable和SortedList的每个元素都是一个健/值对,因此元素类型既不是健类型,也不是值类型,而是DictionaryEntry类型。因此,在foreach语句在需要用DictionaryEntry来操作集合元素。例如:foreach(DictionaryEntrymyDEinmyHashtable){...}2.foreach循环语句为了隐藏集合类型的内部实现方法,373.迭代器从前面的介绍中可以看出,如果要使用foreach语言,就需要在进行迭代的类中实现IEnumerable或者ICollection接口。为了简化foreach语句的使用,C#2.0增加了一种名为迭代器(Iterator)的新功能。只要在类或结构中实现了迭代器,该类或者结构就能支持foreach迭代,而不必完全实现IEnumerable接口。因此,只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动实现IEnumerable接口或者实现IEnumerable接口的Current、MovexNext等成员。迭代器是一个产生相同类型的有序值序列的语句块。迭代器与普通语句块的区别在于迭代器存在一个或多个yield语句:yieldretnrn语句产生迭代的下一个值。yieldbreak语句指示迭代完成,终止迭代。yield关键字用于指定返回的值。到达yieldreturn语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。迭代器的返回类型必须为System.Collections.IEnumerable或System..Collections.IEnumerator.。

温馨提示

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

评论

0/150

提交评论