《C#程序设计案例教程》-第 3 章 C#面向对象编程基础_第1页
《C#程序设计案例教程》-第 3 章 C#面向对象编程基础_第2页
《C#程序设计案例教程》-第 3 章 C#面向对象编程基础_第3页
《C#程序设计案例教程》-第 3 章 C#面向对象编程基础_第4页
《C#程序设计案例教程》-第 3 章 C#面向对象编程基础_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

3.1学会使用已有资源6

{7

staticvoidMain(string[]args)8

{9

StringBuilderformer=newStringBuilder("原始字符串为:");10

StringBuildertotal;11

stringmutation1,mutation2,mutation3;12

inta,b,c;13

doublediscriminant,root1,root2,test;14

Console.WriteLine("原始字符串为:\""+former+"\"");上一页下一页返回3.1学会使用已有资源15

Console.WriteLine("字符串长度为:"+former.Length);16

total=former.Append("ax^2+bx+c");17

mutation1=total.ToString().ToUpper();18

mutation2=mutation1.Replace("X","y");19

mutation3=mutation2.Substring(7,9);20

Console.WriteLine("连接后的字符串为:"+total);21

Console.WriteLine("mutation1--调用大写函数后:"+muta⁃tion1);上一页下一页返回3.1学会使用已有资源22

Console.WriteLine("mutation2--调用替代函数将X替代为y后:"+mutation2);23

Console.WriteLine("mutation3--mutation2的子串:"+muta⁃tion3);24

Console.WriteLine();25

Console.WriteLine("请输入x^2的参数A:");26

a=int.Parse(Console.ReadLine());27

Console.Write("请输入x的参数B:");28

b=int.Parse(Console.ReadLine());上一页下一页返回3.1学会使用已有资源29

Console.WriteLine("请输入方程的常数C:");30

c=int.Parse(Console.ReadLine());31

discriminant=Math.Pow(b,2)-(4*a*c);32

root1=((-1*b)+Math.Sqrt(discriminant))/(2*a);33

root2=((-1*b)-Math.Sqrt(discriminant))/(2*a);上一页下一页返回3.1学会使用已有资源34

Console.WriteLine("Root1:"+root1);35

Console.WriteLine("Root2:"+root2);36

Console.WriteLine();37

Console.WriteLine("让我们尝试随机生成方程:");38

System.Randomgenerator=newRandom(DateTime.Now.Millisec⁃ond);39

a=generator.Next(100)-50;40

b=generator.Next(35);41

c=generator.Next();42

Console.WriteLine("随机生成的方程是:"+a+"x^2+"+b+”x+"+c);上一页下一页返回3.1学会使用已有资源43

Console.WriteLine();44

test=generator.NextDouble();45

Console.WriteLine("test:0.0~1.0:"+test);46

test=generator.NextDouble()*10;47

Console.WriteLine("test:0.0~10.0:"+test);48

Console.ReadLine();49

}50

}51

}上一页下一页返回3.1学会使用已有资源3.1.3.NET框架类之Math类C#标准类库的System命名空间中定义了大量的常用类。其中Math类中提供了大量的基本数学函数,用来帮助执行数学计算。该类主要为三角函数、对数函数和其他通用数学函数提供常数和静态方法。表3.1列出了Math类的一些方法和说明,由于数量较多、用法较简单,这里不一一详解。要查找如何使用每个方法的其他信息,可以搜索帮助文件的“MathMember”。上一页下一页返回3.1学会使用已有资源Math类中的所有方法都是静态方法(staticmethods),也称为类方法(classmethods)。静态方法可以通过定义它们的类名来触发,不需要首先实例化一个类的对象。Math类的方法用于进行数学运算,它们的返回值就是运算结果,可以根据需要用于表达式。例如,下面语句计算变量price的绝对值,将它加上变量aigo的值的3次方,然后将结果存储到变量total中:total=Math.abs(price)+Math.pow(aigo,3);上一页下一页返回3.1学会使用已有资源3.1.4.NET框架类之Random类在编写实际应用软件时,经常需要用到随机数。如游戏中经常要用随机数来表示掷骰子和扑克发牌,网络考试系统中用随机数从题库中抽取考题,飞行模拟也可以使用随机数来模拟飞机引擎发生故障的概率等。Random类是System命名空间的一部分,表示伪随机数生成器(pseudorandomnumbergenerator)。它是一种能够产生满足某些随机性统计要求的数字序列的设备。随机数生成器从一个程序员指定的范围内提取一个值。由于这是用一种确定的数学算法选择的,是以相同的概率从一组有限的数字中选取的,因此所选数字并不具有完全的随机性。但是从实用的角度而言,其随机程度已足够了。上一页下一页返回3.1学会使用已有资源表3.2中列出了Random类的一些常用方法。其中,Next方法用来产生随机整数。它可以不带参数,这样表示产生一个整个int范围内的随机值,包括负数。但是,实际问题中通常需要更具体的范围,可以使用带参数的Next方法返回一个从0到比给定参数(maxValue)小1的范围内的整数值。3.1.5.NET框架类之String类在学习情境一中,已经知道了C#支持的基本数据类型。其中,有用来存放单个字符的char类型,它们用单引号表示。那么,由多个字符组成、用双引号表示的字符串该如何表示呢?在C#中,string作为一种内在的或者原始的数据类型来使用。它可以用简单的变量初始化来创建。上一页下一页返回3.1学会使用已有资源实际上,在C#中也包含了一个名称为String的类,它是string关键字的一个别名,二者可以互换使用。在实例代码中使用关键字string,但是如果在联机帮助文档中查找string,则指向的是String类。这并不矛盾,因为在内部,C#将所有原始类型均表示为类,见表3.3。表3.4中列出了StringBuilder类的一些构造函数和常用成员。上一页下一页返回3.1学会使用已有资源String和StringBuilder两种类型之间的转换方法如下:要从一个String对象中得到一个StringBuilder对象,可使用StringBuilder类的构造函数publicStringBuilder(String);,要从StringBuilder对象中得到String对象,可使用ToString方法。演示如下:StringBuildermyStringBuilder=newStringBuilder(myString);StringmyString=myStringBuilder.ToString();上一页返回3.2学生类的初步设计3.2.1程序描述创建类及对象:本任务设计一个学生基本信息的实体类,并在Windows应用程序的窗体中调用该类。本任务在窗体类中创建并修改学生类实例对象的属性,通过学生类实例调用类中公共方法,最后将调用的结果显示在窗体的label控件上。运行结果如图3.1所示。在已有项目中增加一个新类有两种方法。①选择“项目”→“添加类”菜单项。选中后,VisualStudio将显示“添加新项”对话框,并在模板中已选中“类”。②右击解决方案,选择“添加”→“添加类”。和第①种方法一样,VisualStudio将显示“添加新项”对话框。下一页返回3.2学生类的初步设计输入类名“Student”后,单击“确定”,VisualStudio增加一个新类并显示默认的代码。在该代码框架中添加所需代码后,学生信息实体类的基本设计就完成了。3.2.2代码实现及分析1

usingSystem;2

/*********************************3*类名:Student4*创建日期:2014-10-255*功能描述:学生信息实体类6*******************************/7

namespaceWindowsFormsApplication1上一页下一页返回3.2学生类的初步设计8

{9[Serializable]10

publicclassStudent11

{12

#regionPrivateMembers13

protectedintid;14

protectedintclassID;15

protectedstringstudentNO=String.Empty;16

protectedstringstudentname=String.Empty;17

protectedstringsex=String.Empty;18

protectedstringaddress=String.Empty;上一页下一页返回3.2学生类的初步设计19

protecteddoublepostalCode;20

#endregion21

#regionPublicProperties22

publicintId23

{24

get{returnid;}25

}26

publicintClassID27

{28

get{returnclassID;}29

set{classID=value;}上一页下一页返回3.2学生类的初步设计30

}31

publicstringStudentNO32

{33

get{returnstudentNO;}34

set{studentNO=value;}35

}36

publicstringStudentName37

{38

get{returnstudentname;}39

set{studentname=value;}40

}41

publicstringSex上一页下一页返回3.2学生类的初步设计42

{43

get{returnsex;}44

set{sex=value;}45

}46

publicstringAddress47

{48

get{returnaddress;}49

set{address=value;}50

}51

publicdoublePostalCode52

{上一页下一页返回3.2学生类的初步设计53

get{returnpostalCode;}54

set{postalCode=value;}55

}56

#endregion57

publicboolistownee(strings1,strings2)58

{59

return(s1==s2);60

}61

publicvoideditStu(stringsNo,stringsAdd,doublesPC)62

{63

this.StudentNO=sNo;上一页下一页返回3.2学生类的初步设计64

this.address=sAdd;65

this.postalCode=sPC;66

}67

}68

}代码分析:12~20定义了学生信息类的私有成员。21~56定义了该类的公有属性,并设置其访问器。可利用访问器来访问类的私有成员。其中,Id是只读属性,因为它只有get访问器。上一页下一页返回3.2学生类的初步设计57~60这是一个公有布尔类型的方法,含有两个字符串类型的参数。利用return语句返回(s1==s2)的值。若两个字符串相等,则返回true,否则返回false。在该例中用来判断两个学生是否同乡。61~66这是一个公有无返回值(void)的函数,有3个参数。该函数用来编辑学生的学号、地址和邮编。由关键字void修饰的函数无须return语句。3.2.3方法的解析1.类和对象在深入学习类之前,作为初学者,先分清类和对象的概念。类是一个抽象的概念,对象则是类的具体实例。上一页下一页返回3.2学生类的初步设计比如学生是一个类,张三、李四、王五都是对象;首都是一个类,北京、华盛顿、莫斯科都是对象;动画猫是一个类,Kitty、Garfield和Doraemon都是对象。类是抽象的概念,对象是真实的个体。可以说张三(对象)的体重是55kg,而不能说学生(类)的体重是55kg;可以说北京2008年举办了奥运会,而不能说首都在2008年举办了奥运会。一般情况下,认为状态是描述具体对象而不是描述类的,行为是由具体对象发出的,而不是由类发出的。现实生活中到处都是对象,一个学生、一辆汽车、一头大象,乃至一种语言、一种方法,都可以称为对象。上一页下一页返回3.2学生类的初步设计2.学生类的组成部分学生类由学生的数据声明和方法声明组成。数据声明表现为变量;方法则表现为给定名称的、具有特定功能的一组代码。在C#中,方法都是某个类的一部分。当程序调用一个方法时,C#将控制流程传递给这个方法,按照流程一行一行地执行方法中的语句。方法执行完成后,控制流程返回程序调用方法的地方,继续原来的执行。被触发的方法也称为被调方法(calledmethod),触发它的方法称为主调方法(callingmethod)。如果它们在同一个类中,则调用只需要使用方法名;如果它们不在同一个类中,则要通过其他类的对象名来触发(静态方法可以通过类名或者对象名来访问)。图3.2显示了方法调用时的执行流程。上一页下一页返回3.2学生类的初步设计3.return语句return语句用在方法中。程序执行到return语句时,直接返回方法调用语句。Return语句有两种方式:无表达式的return语句,只能用在无返回值的成员中;带表达式的return语句,只能用在有返回值的函数成员中。①如果是void方法,则可以使用无表达式的return语句,也可以省略。无表达式的re⁃turn语句即“return;”,程序执行到return立即返回调用语句。如果省略return语句,则程序执行到方法的末尾才返回。②对于有返回值的方法,return语句后面可以是常量表达式,也可以是变量表达式,且必须和方法的返回类型是一致的,或者是可以直接隐式转换的。上一页下一页返回3.2学生类的初步设计4.实例方法和静态方法这里主要学习实例方法和静态方法。实例方法是较常见的方法,比如上个任务中,Ran⁃dom类和StringBuilder类中的绝大部分方法都是实例方法。实例方法必须先实例化对象,再用对象调用方法。静态方法也提到过Math类中的所有方法。静态方法使用类名调用。5.方法的重载回想一下刚刚看过的程序片段:publicintSum(intpara1,intpara2){

return

para1+para2;}上一页下一页返回3.2学生类的初步设计该方法实现两个整数的相加。如果想让两个string型或两个double型相加,该怎么做?如果为string、double,再各自写一个方法,那么在调用之前就要先清楚参数的类型。能不能不管参数是什么类型,都不影响函数的调用呢?这就要用到方法的重载。3.2.4域和属性为了保存类的实例的各种数据信息,C#提供了两种方法:域和属性。域(字段)和属性都可以从界面中添加。1.添加域打开类视图,右击要添加域的类,在弹出的菜单中选择“添加”→“添加字段”命令。选择后,VisualStudio弹出“添加字段”对话框。上一页下一页返回3.2学生类的初步设计在对话框中可设置字段的访问、字段类型、字段名和字段修饰符等信息,还可以设置字段的注释说明文字。设置完成后,单击“完成”,类的代码中将被VisualStudio添加字段的声明语句。如:protectedintclassID;其中,字段的访问修饰符可以是以下几种:•new•public•protected•internal•private上一页下一页返回3.2学生类的初步设计•static•readonly静态域的声明使用static修饰符,只读使用readonly修饰符,其他都是非静态域。声明成只读的字段和声明成const的效果是一样的。2.域(字段)的初始化VisualStudio为每个未经初始化的变量自动初始化为本身的默认值。对于所有引用类型的变量,默认值为null。所有变量类型的默认值见表3.6。上一页下一页返回3.2学生类的初步设计3.添加属性在类视图中,右击要添加域的类,选择“添加”→“添加属性”命令,则弹出添加属性对话框。和字段一样,新增属性也可以设置很多信息。其中,访问器一栏表示该属性在被外部访问时,是只能读取(获取)、只能写入(设置)还是可读取加写入。以下是VisualStudio自动生成的代码:publicintClassID{

get{

}

set{

}}上一页下一页返回3.2学生类的初步设计属性的修饰符有以下几种:•new•public•protected•internal•private•static•virtual•sealed•override•abstract上一页下一页返回3.2学生类的初步设计其中,static、virtual、override和abstract这几个修饰符不能同时使用。在属性的访问声明中:①只有set访问器表明属性的值只能进行设置而不能读出;②只有get访问器表明属性的值是只读的,不能改写;③同时具有set访问器和get访问器表明属性的值的读/写都是允许的。添加方法和索引器的向导对话框一目了然,这里就不一一列举了。上一页返回3.3学生类的进阶设计3.3.1程序描述本程序是在3.2节的基础上再做进一步的设计,主要示范重构的构造函数。对于其他知识点,“封装”已经在上个程序的代码中体现出来,“继承”在知识点中有详细例程,请读者根据例子程序自行练习。重构的构造函数演示效果如图3.3所示。3.3.2代码实现及分析展示学生类中的代码框架和上个程序的相同,这里不再占用篇幅,只给出构造函数。publicStudent(){}publicStudent(inti,strings1,strings2,strings3)下一页返回3.3学生类的进阶设计{

this.classID=i;

this.studentNO=s1;

this.studentname=s2;

this.sex=s3;}这两个名字相同的函数是构造函数。第一个为成员变量分配内存空间,给出默认初值;第二个为新建的学生实例初始化基本信息:班级号、学号、姓名和性别。编译器会自动根据参数来选择不同的构造函数。上一页下一页返回3.3学生类的进阶设计3.3.3构造函数和析构函数1.构造函数VisualStudio在新建类时创建的代码中,有一个方法的名字和类名是一样的,这个特殊的方法称为构造方法(函数)。构造函数是对象实例化时触发的方法。如果没有为对象提供构造函数,则默认情况下C#将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置为默认值。不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数,如:Studentscofield=newStudent();上一页下一页返回3.3学生类的进阶设计实际上,经常使用构造函数来初始化那些和每个对象均相关的成员变量,如:

publicStudent()

{publicStudent(stringname,intage,stringhobby)

{

=name;

this.age=age;

this.hobby=hobby;

}}

Student

wu

=

newStudent("吴双",20,"运动");上一页下一页返回3.3学生类的进阶设计由此看出,构造函数也是可以重载的。构造函数在两个方面不同于常规方法:①构造函数与类同名。②构造函数没有返回值类型。这与返回值类型为void的函数不同。程序员常犯的一个错误就是在构造函数的前面加上void返回类型。在构造函数前放任何返回类型,包括void,都将被编译器理解为一个(碰巧)和类的名称相同的常规方法。这样,它就不能作为构造函数来触发,这有时会导致难以解释的错误信息。2.析构函数析构函数用于析构类的实例。程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。上一页下一页返回3

温馨提示

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

评论

0/150

提交评论