第2章C程序设计基础.ppt

上传人:sccc 文档编号:5896178 上传时间:2023-08-31 格式:PPT 页数:97 大小:1.10MB
返回 下载 相关 举报
第2章C程序设计基础.ppt_第1页
第1页 / 共97页
第2章C程序设计基础.ppt_第2页
第2页 / 共97页
第2章C程序设计基础.ppt_第3页
第3页 / 共97页
第2章C程序设计基础.ppt_第4页
第4页 / 共97页
第2章C程序设计基础.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《第2章C程序设计基础.ppt》由会员分享,可在线阅读,更多相关《第2章C程序设计基础.ppt(97页珍藏版)》请在三一办公上搜索。

1、,Web应用系统开发,覃焱,石家庄铁道大学经济管理学院商务信息系,第2章C#程序设计基础,第1节C#语言简介一、C#的起源:,C#继承了C的语法,稍有修改。C#建立在C+的对象模型理论上,并加以改进。C#采用了Java的很多思想、方法,比如通过中间语言来实现程序的可移植性等。,对比Java,1、Java语言的平台独立性:Java源代码编译成独立于平台的Java字节码。然后由Java虚拟机解释执行字节码。只需针对各种平台编写各种虚拟机,使字节码在各种平台上由各自的虚拟机解释执行,从而实现了平台独立性。.NET原理类似,今后只需针对各种平台开发出各种CLR,就可以使MSIL语言代码在各种平台上由各

2、自的CLR执行,来实现平台独立性。,2、其它的类似之处:Java语言的定位是网络编程,取消了指针类型,C#的目标之一也是网络编程。执行Java字节码时,Java虚拟机要对字节码进行安全检查;在运行时,Java字节码被严格限制在特定的内存区域内,任何对这个内存区域外的访问都是被禁止的。C#具有类似的原理。,“如果你会C+,也会Java,那么你已经懂得了C#的90%。”,二、C#程序的简单构成介绍,C#程序是由类构成的,对于一个应用程序来说,必须有一个类中定义Main()方法。,(一)简单的控制台应用程序(Welcome.cs),using System;/C#大小写敏感。语句结尾以“;”结束。c

3、lass Welcome static void Main()/C#调用Main()作为程序的开始,Main的首字母必须大写。Console.WriteLine(“Please enter your name:”);Console.ReadLine();Console.WriteLine(“Welcome to you!”);,1、名字空间,程序中往往会定义很多类,为了合理有效的把这些类组织起来,可以使用名字空间将这些类按一定的关系、层次组织起来。,using System表示导入名字空间System,如果没有该语句则程序必须为:,class Welcome static void Main(

4、)System.Console.WriteLine(“Please enter your name:”);System.Console.ReadLine();System.Console.WriteLine(“Welcome to you!”);,System是C#的一个最顶层的名字空间,Object是C#的最顶层基类,它位于System名字空间中。C#中,所有类都默认是System.Object 派生的。所有的类都直接或间接地继承Object类(即System.Object),System,2、类和类方法,(1)类:每个东西都必须属于一个类。C#程序设计的主要任务就是定义类及类的方法。cla

5、ss Welcome声明了一个类,类的名字叫做Welcome。这个程序所作的事情就是它完成的。,(2)类方法:在.NET 中,所有方法都必须是类或结构的成员。C#程序的执行总是从Main()方法开始的。一个程序中不允许出现两个或两个以上的Main()方法。C中Main()方法也必须被包含在一个类中。,static指明该方法是一个静态方法,表示该方法是一个类方法,而不是实例方法。请大家思考回忆一下,类方法与实例方法在调用的时候有什么不同?,static,3、程序的入口,每个应用程序都有一个程序入口,程序的执行就从这里开始。在C#中是用Main()方法做程序入口的。Main()方法必须是stati

6、c方法。,4、程序的输入和输出:,程序的输入输出都是通过Console来完成的。Console是名字空间System中的一个类(表示控制台输入输出设备,一般指键盘和显示器。)。Console类有两个最基本的static方法:ReadLine:接受输入设备输入WriteLine:用于在输出设备上输出。Console另两个方法是Read和Write,与ReadLine、WriteLine的不同在于:ReadLine和WriteLine执行时多加了一个回车键。,5、分部类型,(1)概念,用partial关键字把一个类的定义分散在多个源文件中,每个源文件中包含一部分类的定义,在编译时,编译器会把每个分

7、部合并为一个整体(分部类型的所有部分必须一起编译,使它们可在编译时被合并)。,举例:,Test1.cs文件:Public partial class Test1/类Test1的方法DoWork1()被定义在Test1.cs文件中。Public void DoWork1();Test2.cs文件:Public partial class Test1/类Test1的方法DoWork2()被定义在Test2.cs文件中。Public void DoWork2();,注意:保证这些分散的定义处在相同的名字空间之内。,(2)分部类的作用,设计大型项目时,可以将类的定义分散在多个文件中,便于多个开发人员并

8、行开发。(有时,把一个较大的类分解为几个部分将使程序逻辑更清晰、简洁。)对某些自动生成的代码文件开发人员没必要去改动,可以另外再新建一个程序源文件对类的功能进行完善。,(二)简单的窗口应用程序(HelloWorldForm.cs),Form1.cs:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Windows

9、Application3 public partial class Form1:Form public Form1()InitializeComponent();private void button1_Click(object sender,EventArgs e)label1.Text=你好,世界;,(三)C#程序的基本构成,一般的C#源程序文件由以下三部分组成:,1、using语句。表示引入其他类的库,using语句可有0到多句,它必须放在类型定义的前面。2、namespace。表示类所在的名字空间。Namespace后的花括号内,可以嵌套一些using语句、类型定义或namespace

10、。每个文件都可以包含多个类型定义、多个名字空间。3、类型定义。是C#源程序的主要部分。类型定义可以位于名字空间之内,也可以位于名字空间之外。,类型定义中最主要的是类的定义(还有结构的定义)。每个类的定义由类头定义和类体定义两部分:,(1)类头定义:声明类名,说明类的继承性。(2)类体定义:定义类的成员,包括属性、域(包括变量、常量、对象数组等)、方法(方法体内不能再定义其它的方法)等成分。类和方法中的所有语句用括起。除using和namespace语句之外的其它的执行具体操作的语句,都只能存在于类的大括号之中。C#语句由表达式、变量、常量和关键字等更小的语言单位构成。,一些基本的关系:,(1)

11、程序包含多个.cs文件。(2)每个.cs文件包含0至多个名字空间。(3)每个名字空间包含多个类的定义。(4)每个方法中含有局部变量定义及语句。(5)语句是构成C#程序的基本单位之一。每条C#语句都由分号(;)结束。,三、C#程序的结构总结,C#程序可由一个或多个文件组成。每个文件可包含一个或多个名字空间。一个名字空间可包含其它名字空间和类、结构、接口、枚举、委派等类型。C#程序的主干如下:,Using System;/using语句Namespace MyNamespace1/名字空间 class MyClass1/类定义 struct Mystruct/结构定义 interface ImyI

12、nterface/接口定义 delegate int MyDelegate();/委派定义 enum MyEnum/枚举定义 namespace MyNamespace2/内部名字空间 class MyClass2/其它的类定义 public static void Main(string args)/类定义中的方法定义,四、C#的常见开发工具,(1).NET Framework SDK:该工具在Windows 2003上已经预装了,之前的windows版本需要手动装。(2)Visual Studio.NET,事实上Visual Studio.NET的核心就是SDK。,推荐使用Visual S

13、tudio.NET提供的集成开发环境来编辑C#程序。原因是:(1)Visual Studio.NET的 IDE支持首行缩进,而且 C#源程序的关键字等可以用不同的颜色直观地表示出来。(2)Visual Studio能动态地查找、提示编辑过程中的错误。(3)如果开发Windows界面应用程序,可像VB一样直接通过拖放控件来“绘制”Windows窗体。(4)有丰富的帮助文档。,第2节C#语法基础,一些说明:1、C#中可用三种注释方式:(1)/用于单行注释,注释从/开始,终止于行尾。(2)/*/用于多行注释。注释从/*开始,到*/结束,这种注释不能互相嵌套。(3)/是C#特有的文档注释。以/开始,直

14、到行尾。,2、C#编码惯例(非强制的)(1)类名、属性名、方法名的首字母应大写,其中包含的所有单词都应紧靠在一起,且大写每个单词的首字母,例如:MyAClass,AuthorName。(2)对于接口的名字,都在前面加上一个I,如:Icomparable。(3)局部变量和参数变量的首字母一般小写。,一、C#中的数据类型1、C#数据类型概述,(1)预定义类型:由语言本身定义(2)用户自定义类型:程序员在程序里根据自己的需求定义的。,无论是预定义类型或用户定义类型,按在内存中的存储方式可分为两大类:数值类型和引用类型。(1)值类型:值类型变量的值直接存于变量中.(2)引用类型:引用类型的变量是指向实

15、际数据的地址。即引用类型的变量要占据一定的内存空间,它所引用的对象实体也要占据一定的空间。引用类型在使用前必须产生其实例。,C#的已定义的数据类型,转义符,转义符是一些有特殊含义、很难用一般方式表达的字符。用反斜线开头,后面跟着一个字符来表示某个特定的特殊字符。如n表示换行,表示单引号字符。,例如:char c,m;c=r;/注意是引号;m=n;这样,变量c和m就分别存储了一个“回车”字符和一个“换行符”字符。,字符可以是字母表中的字符,也可以是转义符,还可以是要表示的字符所对应的Unicode码。当用Unicode码表示的方法是:用u后跟4位十六进制数,如u0041表示字母A。,类型转换,1

16、)隐含转换(implicity):数值范围较小的类型,被赋值给数值范围较大的类型(转换由编译器自动完成)。例如:int a=123;long b=a;,2)显式转换(explicity)long a=123;int b=a;/错,int范围小于long,转换不会发生。可显式进行:long a=123;int b=(int)a;语法:(类型)要转换的数据 显式转换中超出类型的数据内容都会在转换过程中被舍弃而遗失。,装箱和拆箱,1)装箱:将值类型的数据转换成引用类型(如Object)。过程是产生一个对象实例,并把值类型的数据复制到那个实例中。例:int i=10;object obj=i;,装箱机

17、制使得一个需要引用类型做参数的函数可以直接代入一个值类型的数据,从而较好地统一了值类型与引用类型的使用。例如:void F(object obj)Console.WriteLine(obj.ToString();这时,可代入各种类型的参数,这些参数可以隐式地转换成Object对象。如:F(123);,2)拆箱:拆箱是将Object类型显式地转换为值类型。过程是先检查Object实例中被包装的数据,然后把数值从实例中复制出来。,例如:int i=123;object obj=i;/装箱 i=(int)obj;/拆箱,装箱和拆箱使我们能将任何类型的值都可以按对象处理。,using System;,

18、class TestBoxing,public static void Main(),int i=123;,object o=i;,i=456;,Console.WriteLine(The value-type value=0,i);,Console.WriteLine(The object-type value=0,o);,输出The value-type value=456,The object-type value=123,1、数组,数组是有序数据的集合,数组中每个元素有相同的数据类型,可用一个统一的数组名和下标来唯一地确定数组中的元素。,(1)数组的声明:声明:数据类型 数组对象名;为

19、数组对象分配内存空间:数组对象名new 数据类型数组长度;例如:intscore;score=new int100;,或两个步骤合并:数据类型数组对象名new数据类型名数组长度;,数组用new分配空间的同时,数组的每个元素都会自动赋一个默认值(整数为0,实数为0.0,bool型为false,引用型为null)。,数组的初始化:即赋初值。,一维数组:int numbers=new int5 1,2,3,4,5;或:int numbers=new int 1,2,3,4,5;string names=new string3“a”,”b”,”c”;或:string names=new string“

20、a”,”b”,”c”;或在声明数组变量的同时初始化,可省略new:int numbers=1,2,3,4,5 string names=“a”,”b”,”c”;,多维数组:string,ss=“a”,”b”,“c”,”d”;(多维数组是有多个下标的数组,数组的下标之间用逗号分开:数据类型,数组对象名;),(2)数组元素的使用:数组对象名下标,如int score=new int100;有100个元素,分别为:score0,score1,score99。,下标可为整型常数或表达式。下标从0开始到数组长度减1。,二、C#中的变量和常量(一)变量声明和赋值,1、值类型变量的声明和赋值:(声明:数据类

21、型 变量名)int n1;/声明变量 n1=20;/对变量进行相应的赋值初始化。或:int n1=20;/在声明变量的同时赋值。,2、引用类型变量的声明和赋值:TheObject myobject;/为TheObject类创建一个引用类型的 变量,该变量还没指向任何事物。myobject=new TheObject();/将该引用类型的变量指向一个TheObject 对象,利 用new关键字创建一个新的TheObject对象。,3、变量的作用域问题:例如,以下的块定义了一个叫Number的变量:int Number=1;其中用大括号表示开始和结尾。变量Number作用域就局限于这个块内,如果在

22、作用域外访问,就会发生编译错误。,(二)定义常量,与变量不同的是常量必须在声明时就赋值,并且其值不能被修改。例:const int Number=1;其中,const是声明常量前必须加的关键字。,三、C#中的操作符与表达式,(一)赋值运算符:“=”、“+=”、“-=”、“*=”、“/=”、“%=”(取模)。例:double number=2.56;x+=2;/结果等同于:x=x+2;x+=y;/结果等同于:x=x+y;,(二)算术运算符:(1)+加;减;*乘;/除;取模。注:整数进行算术运算结果也是整数,除法的余数被省去。例如10/3结果为3,余数1被省去。,(2)C#对加运算符进行了扩展,用

23、它能进行字符串的连接,例如:”abc”+”de”,可得到字符串”abcde”。,(3)递增递减运算符(又叫“一元算术运算符”),+和i+使用i之后,使变量i的值加1。i使用i之后,将变量i的值减1。+i 使用i之前,使变量i的值加1。i 使用i之前,将变量i的值减1。例如:int x=3;int y=x+;/y=3,x=4 int k=+x;/k=5,x=5,(三)比较运算符,=等于!=不等于大于=大于等于=小于等于,比较值之间的关系,结果是布尔型值(true或false)。,(四)布尔逻辑运算,逻辑运算符,(五)运算符的优先级,运算符优先级从高到底依次是:,说明:(1)可用括号()调整运算符

24、的运算顺序。(2)对相同运算级的运算符,遵循左顺序关联性,由表达式左边开始进行运算。(3)赋值运算符和三元运算符依照右顺序关联性,表达式从右边往左运算。例如:x=10;x=y=z;z的值被指定给y,然后y的值再指定给x。,四、C#中的控制语句(一)选择语句(分支语句),1、if语句if(条件表达式)语句块;else 语句块;说明:语句块是一条语句或用一对花括号 括起来的一系列语句。也可以没有else分支。例:if(a0)b=a;else b=-a;,2、switch语句switch(条件表达式)/条件表达式用()括起来 case 判断值1:一系列语句1;break;case 判断值2:一系列语

25、句1;break;case 判断值n:一系列语句n;break;default:一些系列语句n+1;break;,执行过程:(1)条件表达式求值;(2)若case标签后的常量表达式(判断值)符合条件表达式所求出的值,则内含语句将被执行;(3)若没有case符合条件表达式,则default标签内含语句将被执行;(4)若没有case符合,也没有default标签,则转向switch语段的结束端。,(二)循环语句 1、for语句,重复执行的次数是固定时,可用for循环。,语法:for(表达式1;表达式2;表达式)块语句,例:for(int n=0;n100;n+)Console.WriteLine(

26、n);,若表达式2为空,则表示当前循环是一个无限循环,需要在循环体中写另外的跳出语句(break或goto)终止循环。,2、foreach语句,语法:foreach(类型变量名in数组名)循环体,例:int arrayOfInt=1,2,3,4,5;foreach(int i in arrayOfInt)Console.WriteLine(“Int 0”,i);string arrayOfStr=“Hello”,”Goodbye”,”Why me?”;foreach(string s in arrayOfStr)Console.WriteLine(“String 0”,s);,3、while语

27、句,while(条件表达式)循环体,4、do-while语句do 循环体 while(条件表达式),例:using System;class ShowManyCharValue public static void Main()char c;do Console.WriteLine(输入字符并按回车,按#结束);c=(char)Console.Read();Console.Read();/忽略回车 Console.Read();/忽略换行 Console.WriteLine(c+的Ascii值为:+(int)c);while(c!=#);,(三)跳转语句,用来实现程序执行过程中流程的转移。,(

28、1)continue语句:语法:continue;该语句必须用于循环结构中,作用是终止当前这一轮循环,跳过本轮剩余语句,直接进入当前循环的下一轮。在while和do-while循环中,continue语句使流程直接跳转到条件表达式;在for循环中跳转到表达式3;在foreach循环中跳到下一次循环。当有多层循环时,continue只针对该语句所在循环的最内层循环。,(2)break语句语法:break;只能用于switch语句或循环语句,作用是使程序的流程从一个语句块内跳出来。如从switch分支跳出,或从循环体内跳出。,(3)return语句格式:return表达式;用来从方法调用中返回。其

29、中表达式的值就是方法的返回值。如果方法是void类型(即没有返回值),则return语句中不能有表达式。,(4)goto语句将程序流程从一个地方跳转到另一个地方。语法:goto 标号;定义标号的方式是在标号后加一个冒号。Goto不能转到一个语句块内部或其它函数内部。一般用于将流程转移到多层循环之外,或使流程转到一个公共地方。在switch语句中,goto有如下用法:goto case 常量;goto default;用于在switch语句中由一种情况转向另一种情况。,(四)异常处理语句,try catch(exceptiontype e)finally 说明:(1)exceptiontype是

30、System.Exception类或从System.Exception派生的类型。(2)try块内语句如果顺利执行,就执行finally(若有finally);若try块内语句执行出现异常就在发生异常的地方中断程序的执行。判断是什么类型的异常,根据异常情况而寻找相应的与异常匹配的catch子句去执行。如果找不到匹配的catch子句,可由常规catch块捕捉异常。执行完catch子句后再执行finally块。(3)不带参数的catch(后面没有括号)可捕获任何类型的异常,叫常规catch块。,throw关键字,throw关键字可产生异常,这个关键字需要把新初始化的异常作为其参数。例如:throw

31、(new System.Exception();,程序示例:try Console.WriteLine(执行try块);throw(new Exception(try 块中的异常);catch(Exception e)Console.WriteLine(异常处理:+e.Message);finally Console.WriteLine(执行finally块);Console.ReadLine();执行结果:执行try块异常处理:try 块中的异常执行finally块,第3节C#中的类机制简介,类的成员可分成三大类:,(1)数据成员:描述类的状态,包括域(也叫成员变量、字段)、常量、事件。(2

32、)函数成员:描述类的行为,包括方法、属性、索引器等。(3)嵌套类型:是指在类体中定义的类、结构、枚 举、接口。,一、类、域、方法 1、定义类以及其中的域和方法,class 类名/类头/类体,用一对大括号括起,里面包含域、方法、属性、索引、嵌套类定义等成员。域/域表明对象的状态 方法/方法表明对象所具有的行为。,例:Class person public string name;/域 public int age;public void sysHello()/方法 Console.WriteLine(“Hello!My name is”+name);public string getInfo()

33、return“Name:”+name+”,Age:”+age;,(1)域:表示事物的性质状态,又称为域变量、成员变量、字段。,定义方式:(域也是变量,定义方式与变量的定义方法相同)类型名域名;或:类型名域名值;(如果不赋初值,系统会自动赋一个默认数值:数值型为,布尔型为false,引用型为null。),可以用类对象来做成员变量,见下例:,class point public int x;public int y;class line public point starting=new point();/域是数据类型为类point的对象变量。public point ending=new poi

34、nt();class lineApp/lineApp是执行程序的类 public static void Main()/类Main()方法 line myLine=new line();/创建line的一个实例对象myLine myLine.starting.x=1;/将对象myLine的starting成员的x成员赋值为1。myLine.starting.y=4;myLine.ending.x=10;myLine.ending.y=11;System.Console.WriteLine(“Point 1:(01)”,myLine.starting.x,myLine.starting.y);S

35、ystem.Console.WriteLine(“Point 2:(01)”,myLine.ending.x,myLine.ending.y);程序运行结果:?,(2)方法,修饰符返回值类型方法名(形式参数列表)方法体各语句;,(3)嵌套的类型定义,除了可以在名称空间中定义类之外,还可以在类中再定义类。,例1:public class MyClass public class myNestedClass/定义了一个嵌套于MaClass类的类。public int nestedClassField;/嵌套类的成员变量(域)。,如果要在MyClass的外部实例化myNestedClass,必须限定

36、名称,例如:,MyClass.myNestedClass myObj=new MyClass.myNestedClass();,例2:参见前面line.cs例子,对于类point,如果只在类line中使用point,则可将类point的定义放在类line中(成为嵌套的类),class line class point public int x;public int y;public point starting=new point();public point ending=new point();,2、构造方法与析构方法,每个对象都定义有一个明确的生命周期:从使用类定义开始到删除它为止。对象

37、的生命周期可分成三个阶段:构造阶段、“正在使用”阶段、析构阶段。其中:,构造阶段:对象最初进行实例化的时期。这个初始化过程称为构造阶段,由构造函数完成。析构阶段:在删除一个对象时,常常需要执行一些清理工作,例如释放内存,由析构函数完成。,(1)构造方法(构造函数),是与类同名,专门用于创建对象、完成初始化工作的方法。,例如:可以给Person类加上一个构造方法如下:Person(string n,int a)name=n;age=a;,说明:C#中不能显式地直接执行调用构造方法,而是用new关键字来调用.,(2)默认构造方法,一般情况下,类可有一个至多个构造方法。如果在定义类时,没有定义任何构

38、造方法,系统会自动产生一个构造方法,称为默认构造方法。默认构造方法不带参数,并且方法体为空。如:public Person()。(而带有参数的构造函数通常用于给存储在对象中的数据提供初始值)。一旦用户提供了一个或多个构造方法,系统就不会提供默认构造方法。,(3)析构方法(又叫析构函数),类名()该方法不带参数,不能写返回类型,不能有修饰符,一个类的析构方法最多只有一个。如果没有提供析构方法,则系统自动生成一个。(说明:一般不需提供析构方法代码,而是由默认的析构函数执行操作,但如果在删除实例对象前需要完成一些重要的操作,就应提供特定的析构函数。),3、为方法的参数使用关键字,一般情况下,当变量被

39、作为方法的参数时,变量的值可以在方法体内被修改、使用,当方法调用完毕,程序返回调用处时,该变量在方法体内被赋予的值将不会被保留。通过使用方法参数关键字,可以更改这种行为。,声明方法参数时可以使用三种关键字:params、ref、out。,(2)ref关键字:使用该关键字后,在方法中对参数所做的任何更改都将保留在该变量中。说明:参数必须先初始化。属性不是变量,不能作为 ref 参数传递。,(1)params:当方法的参数是一维数组类型时,要使用params。如:int。用params修饰的参数叫参量参数,参量参数必须是参数列表中的最后一个。,示例,using System;,public cla

40、ss MyClass,public static void TestRef(ref char i),i=b;,public static void TestNoRef(char i),i=c;,public static void Main(),char i=a;/若使用ref关键字,则变量i的在使用前必须初始化。,TestRef(ref i);,Console.WriteLine(i);,TestNoRef(i);,Console.WriteLine(i);,输出?,(3)out关键字,作用与ref类似,不同的是不必初始化作为out参数传递的变量。但必须在方法返回前为out参数赋值。,示例/

41、cs_out.cs using System;public class MyClass public static int TestOut(out char i)i=b;return-1;public static void Main()char i;/变量不必初始化 Console.WriteLine(TestOut(out i);Console.WriteLine(i);输出?,4、对象的创建与使用,创建类的对象的步骤:(1)声明变量:类名变量名;(2)创建对象:变量名new 构造方法(参数);,例如:Person p=new Person(“Liming”,20);,对同一个类,可以多次

42、使用new方法生成不同的对象,这些对象分别对应于不同的内存空间,它们的值是不同的,可以完全独立地分别对它们进行操作。,要访问或调用一个对象的域或方法,需要使用运算符“.”连接这个对象和其域或方法。例如对前例:Console.WriteLine(P.name);/显示对象变量p所指向的对象的name域的值。p.sayHello;/调用对象变量p所指向的对象的方法sayHello。只能通过对象变量来访问对象的域或方法。,5、使用this关键字,在方法中,可以使用this来表示这个对象本身(即在方法中,this表示该方法所属的这个对象)。,(1)可使用this来访问对象(或类)的域和方法。例:在下面

43、的方法sayHello中使用name与使用this.name是相同的:void sayHello()Console.WriteLine(“Hello!My name is”+name);与void sayHello()Console.WriteLine(“Hello!My name is”+this.name);,(2)使用this可解决局部变量或参数变量与域同名的问题用this可解决局部变量(即:方法中的变量)或参数变量与域变量同名的问题。例如在构造方法中可以这样用:public Person(int age,string name)/age和name叫参数变量。this.age=age;/

44、this.age表示方法所属的这个对象的域变量,age是传入的参数变量。this.name=name;,由于this指的是对象,所以不能通过this来引用静态成员(变量或方法)。同时,在static方法中,不能使用this。,二、属性,域是用来表达事物的状态的,属性则用另一种方式来表示事物的状态。对所有有必要在类外可见的域,C#推荐采用属性来表达。,(1)属性的定义:属性的存取方式可以是读或写,分别用set方法和get方法来表示。修饰符类型名 属性名 get/取字段数据程序的代码 set/设置字段数据程序代码(如果没有set方法则表示属性是只读的;如果没有get方法则表示属性是只写的。),cl

45、ass Person private string myName=N/A;/域变量 private int myAge=0;/域变量 public string Name get/get访问操作返回的是属性的值。return myName;set/Set访问操作是设置属性的值,其值可用隐含参数value来接受传递 myName=value;,说明:这里的value是C#中的保留字、关键字,是我们进行属性操作时的set方法的隐含参数。例如:person.Name=”liming”,实际上把值”liming”赋给了参数value,由value把值带进set方法体内,再根据方法体内的程序逻辑来决定是

46、否把值赋给myName。,(2)属性的访问:,访问属性时,可以用下面的方式来对属性进行访问:对象.属性,如:public int Size/在类foo中定义属性Size。getreturn size;/size和Size不同,前者是域名,后者是属性名。setsize=value;使用时可以简单地使用:int a=foo.Size/使用属性的值。foo.Size=100;/设置属性的值。,执行这种使用或设置属性值的语句时,C#编译器将自动调用属性的get或set方法。,class CH private int fAge;/定义实数类型的数据成员(域变量)public int Age/定义属性 g

47、et return fAge;set if(value=18,例:,属性和域的差别:属性可实现只读、只写,而域不行;属性的set方法可以对用户指定的值(value),进行有效性检查,从而保证只有正确的状态才会得到设置,而域本身不行;属性的get方法不仅可以返回域变量的值,还可以返回一些经过计算或处理过的数据。属性不表示存储位置,这是属性和域的根本性的区别。,使用原则:若在类的内部记录事物的状态信息,则用域变量;域变量一般用private修饰,以防止对外使用;对外公布的事物状态信息使用属性;属性一般与某个或某几个域变量有对应关系。,三、类的继承,一个父类可以同时拥有多个子类。但C#不支持多重继承

48、,所以一个类只能有一个直接父类。,1、类的继承 class 类名:父类名,如果缺省冒号和父类名,则该类为Object(即System.Object)的子类。,2、域的继承、添加与隐藏,(1)域的继承:子类自动继承父类的域而不用把父类的域重复定义一遍,实现了代码的重用,减少了程序的维护量。(2)域的添加:定义子类时加上新的域变量,就可以使子类有比父类多的成员。(3)域的隐藏:子类重新定义一个与从父类那里继承来的域变量完全相同的变量,称为域的隐藏。(在实际程序设计中用得少。)隐藏父类的域时,应该在子类的同名域的声明前面加一个修饰符new,否则编译出错。例如:class A public int a

49、;class B:A new public int a;,3、方法的继承、添加,(1)方法的继承:父类的方法自动被子类继承。(2)方法的添加:子类可添加一些新方法,以针对子类实现相应的功能。,4、使用base关键字,用于从派生类中访问基类的成员:只能在构造函数、实例方法中使用,不能从静态方法中使用。,(1)使用base访问父类的域和方法。当子类的与父类同名的成员覆盖(override)了父类的成员时,又要调用父类的成员,就必须使用base。(2)使用父类的构造方法,5、父类与子类的转换,存在继承关系的父类对象和子类对象之间也可以在一定条件下相互转换:,(1)子类对象可被视为其父类的一个对象。比

50、如一个student对象也是一个Person对象:Person p;p=new Student();/这里Student类是Person类的子类。(2)但父类对象不能被视为其某个子类的对象。比如不能如下编程:Student s;s=new Person();,(3)如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。例如WriteLine(object)方法,因为任何类都是Object的子类,所以可用Console.WriteLine(new Person(),class Animal/基类 EatFood();Breed();class Cow:Anim

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号