ASP.NET程序设计教案第4章C#基础课题第4章C#基础章节课时2教学目的要求本章主要讲解C#的基础知识,为Web应用程序的开发打好语言基础。C#是从C和C++发展而来,它继承了C++和Java语言的优点,是面向对象的高级程序设计语言,它具有功能强大和语言简洁高效、与Web技术紧密结合、完整的安全和错误处理机制等特点。教学重点类和类的使用及流程控制教学难点类的概念教学环境多媒体教室板书设计4.1C#简介C#是微软.NET开发平台下的编程语言,是.NET开发平台的核心。微软的.NET为开发程序开创了新的局面,使开发网络程序变得简单,该平台也提供一种更为强大有效的Web服务,通过丰富的类库可以使程序员快速开发所需要的程序。4.1.1C#语言的特点C#是专为.NET开发平台而设计的编程语言,C#与.NET紧密结合,.NET的各种优点通过C#体现出来,但是C#没有自己的运行库,C#作为.NET的服务提供者之一,它使用.NET的类库,这些类库也为.NET平台的其他开发语言提供支持,这正是.NET开发平台的突出特点。C#语言的最大特色去掉了C/C++中的指针,在C#中,对类、方法的引用变得简单,只有一个“.”符,可理解为通过“.”符实现了类或方法的嵌套。C++语言是面向对象编程语言,从C++发展而来的C#当然也是面向对象开发语言,C#只允许单继承,不支持多继承。因此,不能定义虚基类,这就使类的定义和继承变得简单,这与C++不同,而且C#中不允许定义全局变量和全局函数。C#与Web技术紧密结合,C#通过SOAP(SimpleObjectAccessProtocol)实现了应用程序的解决方案与Web标准相统一。有了Web服务框架的帮助,程序员能够利用已有的面向对象编程知识与技巧开发Web服务,而这一过程用的语言是C#语言。C#具有完善的安全性和错误处理,在C#中消除了软件开发中易犯的错误,并提供完整的安全机制,另一方面C#能以更少的代码实现同样的功能。.NET平台提供了垃圾自动回收,来完成资源的释放与对象撤销时内存的回收工作。C#还支持版本控制技术,具有较好的灵活性及兼容性等优点。4.1.5一个C#应用程序这里以创建和编译一个控制台程序为例,介绍使用C#命令行编译器编译应用程序的方法。该程序的功能是在执行后显示“HelloWorld!”,程序代码如下:usingSystem;namespaceMyFirst{publicclassHelloWorld{publicstaticvoidMain(){Console.WriteLine(“Hello,World!”);}}}以扩展名.cs保存文件,这里取MyFirst.cs。如果使用微软提供的visualC#命令行编译器可用以下命令:cscMyFirst.cs,这样会生成一个MyFirst.exe可执行程序。输入命令行执行该程序会输出“HelloWorld!”。代码分析:首先强调C#对大小写敏感。这里using、namespace、class、public、static、void和Main都是C#保留字,usingSystem指引System命名空间,每一个命名空间可看作是同类对象的一个集合,内部包含很多个类。程序员要自己定义命名空间就要用保留字namespace,本例中自定义了一个命名空间MyFirst。Main方法是应用程序的入口,Main的M要大写,这与C/C++不同。本章的例子程序都已在.NET2003开发环境下正确运行。4.2.2引用类型引用类型包括类(class)、接口(interface)、代表(delegate)和数组(array)。4.2.2.1类在面向对象设计方法中,类是一系列具有相同性质的对象的抽象,类是一个数据结构,将对象的属性(状态)和方法(行为)统一在一个单元中,是对对象共同特征的描述。以学生为例,所有学生都有学号、姓名、性别、年龄、所属系别、联系电话等,将这些共同的特征和一些方法定义在一个模板中就构成了学生类,如果这个学生类中指定了具体的值,如“200011070,张亮,男,20,计算机科学系,67698623”,这就是学生类的一个实例,或者叫对象。对象是类的一个实例。类和对象是密切相关的,没有脱离对象的类,也没有不依赖类的对象。类支持继承机制,通过继承和派生类可以扩展类的数据成员和函数成员,从而达到代码复用的目的。有关类的详细情况将在第5节中详细叙述。下面是一个名为Myclass的简单类的声明:[例4.3]程序清单P4-3publicclasspoint{publicintx,y;publicpoint(intx,inty){this.x=x;this.y=y;}}使用new创建类的一个对象,为该对象分配内存,pointp1=newpoint(5,15)创建类的一个对象必须使用关键字new来进行声明,而对于结构变量可以使用直接声明,也可以使用new进行创建,因为结构是值类型,类是引用类型。对于值类型,每创建一个变量,就在内存中开辟一块区域,而对于引用类型,每个变量只存储目标的引用,当系统新建一个引用变量时,就增加一个指向目标的指针。当不再需要对象时,该对象所占内存将被系统自动回收,在C#中不准显式地释放对象,这与Java一样。关于类的详细介绍将在第4节中叙述。4.2.2.2接口上面讲过类是一系列具有相同性质的对象的抽象,而接口是定义一个约定,是对一组能够提供相同服务的类的抽象,接口对程序中的各个类进行分组。接口通过关键字interface进行定义。接口支持多继承(multipleinheritance)。在下面的示例中,接口CComboBox同时继承了接口CtextBox和接口ClistBox:interfaceCdraw{voidpaint();}interfaceCTextBox:Cdraw{voidSetText(stringtext);}interfaceCListBox:Cdraw{voidSetItems(string[]items);}interfaceCcomboBox:CtextBox,ClistBox{}这里只对接口进行概念性介绍,详细介绍将在后面阐述。4.2.2.3代表代表类似于C++编程语言中的函数指针,但与函数指针不同,代表是面向对象和类型安全的。用来封装某个方法的调用过程。代表delegate是关键字,它所封装的方法一定要与某个类或对象相关联。代表将方法处理为实体,使其能够被赋值给变量,并作为参数传递。代表的使用分3步:定义、实例化和调用。如:delegateintw1(stringtext);delegatevoidw2();代表的实例化使用new来完成,同时还需要指定所封装的方法,如:WLtd=newW2();这样td就是系统定义的类Systemdelegate的一个扩展。[例4.4]程序清单P4-4usingSystem;delegatestringDelegate_one();//声明一个代表publicclassMyDelegate{publicstringMyDelegate_Normal(){return“non-staticdelegaterevoked.”;}publicstaticstringMyDelegate_static(){return“staticdelegaterevoked.”;}}publicclassMyclass{publicstaticvoidMain(){MyDelegateMyDele=newMyDelegate()Delegate_oned=newDelegate_one(MyDele.MyDelegate_Normal);Console.WriteLine(d());d=newDelegate_one(MyDelegate.MyDelegate_static);Console.WriteLine(d());}}该程序输出结果为:non-staticdelegaterevoked.staticdelegaterevoked.4.3变量和参数变量是用来描述一条信息名称,可用变量来表示和存储各种类型的信息。变量代表存储地址,当定义了一个变量后,系统会给该变量分配一定的存储空间,因此变量在使用之前必须先定义。C#中定义了7种类型的变量:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。C#中对变量的命名要求有:1)变量名必须以字母开头。2)变量名只能由字母,数字,下划线组成,不能包含空格,标点符号,运算符号等。3)变量名不能使用C#中的关键字(如using,int等)。4)变量名不能使用C#中库函数名称(如Main,write等)。在C#中如果在关键字,库函数名前加“@”作为一个变量命名则是合法的,但不推荐使用这种方式来命名一个变量。在变量命名中应尽量体现变量的性质、内容等信息的名字,应尽可能做到见名识义,这样利于程序的阅读。另外,可以在一条语句中命名多个变量,如inta,b,c=2,d;在面向对象程序设计中由访问修饰符来对变量进行访问限制,C#提供了下面几种访问修饰符:1)public:表示对变量的访问不受任何限制。2)protected:表示可以在类的内部访问该变量。3)protected:表示只能在包含变量的类或类生类中对变量进行访问。4)internal:表示变量的访问范围只能在当前工程或模块内。5)private:表示变量的访问只能在包含它的类中。6)static:表示变量为静态变量。7)ref:表示变量为形式参数变量。变量的数据类型为C#中对应的关键字。如:classdemo{publicstaticintx;inty;voidFun(inta,refintb,int[]v,outintc){inti=2;c=a+b--;}}x是静态变量,y是实例变量,a是值参数,b是引用参数,v[1]是数组元素,c是输出参数,i是局部变量。1)静态变量。用static修饰符声明的变量为静态变量。所谓静态变量指变量只需创建一次,在后面的程序中可以多次引用。如果类中的一个成员变量被定义为静态的,那么类中的所有成员都可以共享这个变量。静态变量的初始值就是该变量类型的默认值。2)实例变量。未用static修饰符声明的变量为实例变量。当个类的实例被创建后,直到实例在内存中被释放,该实例变量就一直存在。3)局部变量。指在一个独立的程序中声明的变量,它只在该程序块中有效,程序离开这个范围变量就失效。如for循环语句中控制循环次数的变量。局部变量不会被自动初始化,因此,它没有默认值,在其有效范围内也同样要先声明后使用。4)值参数。未用ref或out修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员时开始存在,并用调用中给定的自变量的值初始化。5)引用参数。用ref修饰符声明的参数是引用参数。变量作为引用参数在函数成员调用之前必须先赋值,在函数成员内部,引用参数被视为已赋值。在结构类型的实例方法或实例访问器内部,关键字this的行为与该结构类型的引用参数相同。6)输出参数。用out修饰符声明的参数是输出参数。输出参数不会被保存到新的存储位置。变量作为输出参数在函数成员调用中传递之前不一定要显式赋值。在函数成员内部,输出参数被视为未赋初始值。函数成员的每个输出参数在该函数返回前都必须明确赋值。关键字this的行为与该结构类型的输出参数相同。7)常量。C#中可用两种方式来定义常量,常数常量和只读常量。常数常量使用关键字const来定义,要求在定义时赋值。如:publicconstdoublepi=3.141592;这样定义pi为常量后,对常量pi的操作只能是读,不能对pi进行修改。常数常量通常为值类型,如果是引用类型必须在初始化时为其赋予null值。在定义常量时,可以使用修饰符new,public,protected,internal和private进行限制。只读常量使用关键字readonly来定义。只读常量的值在程序运行中第一次使用时被确定,只读常量前加修饰符static表