HeadFirstC#中文版三.doc

上传人:laozhun 文档编号:2388852 上传时间:2023-02-17 格式:DOC 页数:38 大小:2.76MB
返回 下载 相关 举报
HeadFirstC#中文版三.doc_第1页
第1页 / 共38页
HeadFirstC#中文版三.doc_第2页
第2页 / 共38页
HeadFirstC#中文版三.doc_第3页
第3页 / 共38页
HeadFirstC#中文版三.doc_第4页
第4页 / 共38页
HeadFirstC#中文版三.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《HeadFirstC#中文版三.doc》由会员分享,可在线阅读,更多相关《HeadFirstC#中文版三.doc(38页珍藏版)》请在三一办公上搜索。

1、你写的每一个程序都解决一个特定的问题。写程序的时候,先想一想程序要解决什么问题是个好注意。这就是对象这么重要的原因。它让你可以基于要解决的问题来组织代码,这样你就可以集中精力于思考程序要解决的问题而不会被书写代码的技术细节纠缠住。正确的使用对象,你可以写出凭直觉的代码,它会易读易改。Mike是怎么思考他的问题的Mike是一个程序员,他正要去参加一个面试。他已经等不及要去秀一秀C#技巧了,他是他得先去面试地点-并且他快要迟到了!Mike车上的导航系统怎么思考问题Mike自己编制了车辆导航系统,用来给自己在城里导航。Mike的街道导航系统和Mike以相同的方法解决问题。Mike的导航类有用来设置和

2、修改路径的方法Mike的导航器类有一些方法,功能就是在里面实现的。但是和你知道的button_Click()方法不一样,他们都围绕着一个问题:在城市中导航一条道路。这也就是Mike要把它们归为一类,并称该类为Navigator的原因了。Mike设计导航器类来方便的生成和修改路径。要得到一条路径,先要调用SetDestination()方法来设置目的地,然后用GetRoute()方法把路径信息包含到一个String中去。如果需要改变路径,他的程序调用ModifyRouteToAvoid()方法来避开一条特定的街道,然后再调用GetRoute()方法来得到新方向。有的方法有一个返回值每个方法都是用

3、语句组成的。有的方法只是执行完了语句就退出了。但是有的方法就有一个返回值,或者说一个在方法内部生成的或者计算得来的值,并把它送回到调用它的语句去。返回的值的类型(比如String、int)叫做返回类型。return语句告诉方法马上退出。如果你的方法没有返回值-也就是说返回类型为void-那么return语句就用分号结束,或者干脆不写return语句都可以。但是如果方法有返回类型,那么就必须有return语句。这个语句调用方法来计算两个数字相乘。它返回一个int:用你所学的构建一个简单的应用我们在一个类里面创建一个窗体,让它的按钮调用一个该类中的方法。1 在IDE中创建一个新的窗体应用。然后添加

4、一个叫做Talker.cs的类文件。你把类文件命名为Talker.cs,IDE就会自动把文件里面的类命名为Talker。然后,IDE就会在一个新标签页里面弹出这个类。2 在类文件开头添加一句using System.Windows.Forms;然后向类里面添加代码:这个新类的BlahBlahBlah()方法接受两个参数。第一个参数告诉它说什么,第二个指示说几遍。它被调用的时候将会弹出一个消息框,带有重复的字符串信息。它的返回值是字符串的长度。它的thingToSay参数接受String,numberOfTimes参数接受一个数字。它将会在窗体的TextBox控件和NumericUpDown控件

5、里得到这两个参数。Mike有个好主意面试进行的很顺利!但是早上的交通堵塞让Mike想要改进他的导航器。Mike可以创建三个不一样的导航器类.Mike可以把Navigator类的代码复制进另外两个类里面。这样他的程序就可以同时存储三条路径了。对!同时维护三份一样的代码太麻烦了。很多你需要解决得问题都需要反复运用一件事物。在这儿是很多条路径。但是也有可能会是涡轮、狗、音乐文件,任何事物。这些程序有一个共同点:用同样的方式对待同样的事物,不管这样的事物有多少个。Mike可以用对象解决他的问题在C#中你可以运用对象作为处理相似事物的工具。Mike可以只编写一次,但是多次的使用,随你需要。创建一个对象只

6、需要用new关键字和一个类的名字。现在你可以用这个对象了!你创建了一个类的对象,这个对象就可以用类里面定义的所有方法。你是用类来生成对象类就像是对象的蓝图。如果要在一个市郊房地产开发中建五座一样的房子,你不会请建筑师来画五个一样的蓝图。只要用一张蓝图建五座一样的房子就可以了。一个对象是从它的类里面得到的方法一旦写好一个类,你可以用new语句来创建任意数量的对象。这样创建了对象之后,类里面的每一个public方法都是对象的一部分。一个类的对象也叫做那个类的实例你猜怎么样.你已经见过了!工具箱里的每个东西都是类:有Button类、TextBox类、Label类,等等。你从工具箱里面拖拽出来一个Bu

7、tton,IDE就会自动创建一个它的实例并命名为button1。在拖拽一个Button,将会在创建一个实例叫做button2.每一个Button的实例都有自己的属性和方法。但是每一个按钮行为都是一致的,因为他们都是同一个类的实例。自己查看一下!打开一个含有叫做button1的按钮实例的工程,在IDE里面搜索“new Button”。你将在窗体设计器里发现创建Button类的实例的代码。由对象带给你的.更好的解决方案!Mike想出了一个新的路径比较程序,它用对象来找出三条目的一样的路径中最短的一条。下面是它构建程序的方式。1 Mike设计的GUI中有TextBox-textBox1中填写目的地。

8、然后添加TextBox2,填写需要避开的街道;TextBox3填写第三条路径必须经过的街道。2 他创建一个Navigator对象并设置目的地。3 然后创建第二个Navigator对象,叫做Navigator2.调用SetDestination()方法来设置目的地,然后调用ModifyRouteToAvoid()方法。4 第三个Navigator对象叫做Navigator3.Mike设置它的目的地,然后调用它的ModifyRouteToInclude()方法。5 现在Mike可以调用每一个对象的TotalDistance()方法来看看到底哪一个路径最短。他只需要写一次代码,而不是三次!创建一个类

9、的对象就叫做创建这个类的一个实例。按照Mike做的步骤来写代码,创建Navigator对象并调用它们的方法。你不用创建Talker类的实例就可以调用方法。只需要这样:Static方法就是这么调用的,你已经这么做过了。如果你把BlahBlahBlah()方法的static关键字去掉,那你就一定要创建一个Talker的实例来调用这个方法。除了这个区别,静态方法和实例方法一样。你可以给它传递参数,它会返回值,并且它处在类里面。你还可以用static关键字做一件另外的事儿。你可以把整个类声明为static,那么它的所有方法一定要是静态的。如果给一个静态类添加一个非静态方法,会无法编译的。问:我想到静态

10、就想到了不会改变的东西。这意味着非静态方法可以改变而静态方法不能改变吗?它们的行为方法有区别?答:不,静态的和非静态的方法行为方式是一样的。唯一区别是静态方法不要求一个实例,而非静态方法要有实例才行。很多人记不住这一点,因为“静态”这个词汇不是很直观。问:如果我不创建我的类的一个实例我就不能用它?答:可以用它的静态方法。但是非静态方法就需要创建实例了。问:那我干嘛要写需要实例的方法呢?我为什么不把所有的方法都写成静态的?答:因为如果你的对象需要保持一些数据-比如Mike的每个Navigator对象都需要保持一个路径的数据-这样你才可以用每一个对象来操作不同的数据。所以当Mike调用Naviga

11、tor2对象的ModifyRouteToAvoid()方法的时候,只会影响保存在这一个实例里面的路径数据,不会影响到Navigator2和Navigator3对象。这样Mike就可以同时操作三条路径-它的程序就可以同时跟踪它们。问:实例是怎么保持数据的?答:翻过页来找答案!实例用字段来保持数据你在IDE中通过设置按钮的Text属性来改变按钮上的文本。你这样做的时候,IDE添加这样的代码:现在你知道button1是Button类的实例。上面的代码就是在修改button1实例的字段。你可以向类图添加字段-只需要在类图中间划一道水平线,线上是字段,下面是方法。对象可以做的是方法,知道的是字段。Mik

12、e创建了Navigator类的三个事例,他的程序创建三个对象。每个对象用来保持一个不同的路径。程序创建Navigator2实例并调用它的SetDestination()方法的时候,这只是设置了这一个实例的目的地。但是不会影响到Navigator1和Navigator3实例。一个对象的行为是用它的方法定义的,并且它用字段来保持自己的状态。我们来创建一些实例!向类里面添加字段很容易。只要在方法外面声明变量就可以了。这样每一个实例都可以得到这些变量的一份拷贝。感谢内存你的程序创建一个对象之后,对象就处在于电脑的一个区域中,叫做堆。你的程序用new语句创建一个对象,C#就会在堆中与分配一块空间来存储对

13、象的数据。你的程序创建的对象会被添加到堆你的程序心里在想什么你的程序就是这样创建一个Clown类的实例的:Clown myInstance = new Clown();实际上上面是两个语句连在了一起。第一个语句声明一个Clown类型的变量(Clown myInstance;)。第二个语句创建一个对象并把它赋值给刚刚创建的变量(myInstance = new Clown();)。下面是每一个语句执行之后的堆的情况:你可以给类和方法命名来让代码直观把代码放在方法内,就是在选择到了程序的结构。你用过方法吗?你会把一个方法分裂到多个方法吗?你需要方法吗?你对方法做的选择会让你的代码更直观-如果你不细

14、心的话,反而就更费解了。1 这儿是一段紧凑的代码。这段代码来自于一个控制生产糖果的程序。再看一会儿。你知道这段代码是做什么的吗?2 从这段代码你看不出来它是做什么的。在这个情况下,程序员很乐于把所有代码都写到一个方法。但是把代码弄得尽可能紧凑并不是很有用!我们来把它分到多个方法来让它易读,缤纷确定把类名命名的有意义。我们还是从分析代码做什么来开始。3 那一页手册使得代码容易理解了。这提示了我们怎么把我们的代码写的更易懂。现在我们知道为什么代码里有一个比较t和160的条件测试-手册说温度高于160对于糖果来说过热了。也看明白了“m”是一个控制糖果机的类,它有测试糖果温度的静态方法。我们来把温度检

15、测放进一个方法,并给类和方法命名来让它们的名字有意义。4 如果糖果过热了,手册指示说怎么办?它告诉我们启动冷却系统。我们再写一个方法,并给T类和ics类取一个好名字。5 现在代码直观多了!即使你不了解冷却系统,这段代码也很容易理解了:仔细考虑你的代码需要解决得问题可以使得你的代码易读、易写。如果你的方法名字对于了解这个问题的人有意义,那么你的代码将会更易懂.也易于开发!给你的类一个自然的结构花一会时间想一想为什么你想要让你的方法直观:因为每个程序都解决一个问题或者有一个目的。有可能不是业务问题-有时候一个程序的目的只是要耍酷或者为了好玩!无论你的程序要解决什么问题,你的代码写的越像你要解决得问

16、题,你的程序就越容易写(容易读,容易修改,容易维护)。我们来创建一个类图再看一下上一页的第五个步骤里的if语句。你已经知道语句都要在方法体里面,对吧?在这个例子里,if语句处于DoMaintenanceTests()方法里面,而这个方法属于CandyController类。现在看看代码再看看类图。看出来它们之间的联系了么?我们上一页写的糖果制造控制系统的代码调用另外三个类。向回翻页看看代码,并填写下面的类图。类图帮你把类组织的有意义画类图帮你更容易的在写代码之前发现潜在的问题。在处理代码细节之前从一个更高的角度考虑可以帮你把代码结构组织的更集中于它要解决得问题。它会帮你避免写不必要的或者结构差

17、劲的类和方法,而写出来的都是直观的和易用的。这些类都有一个严重的设计缺陷。写下你认为每个类有什么不对,并写下你打算怎么修改。我们就是这样改正这些类的。这只是改正的一种方法-还有很多其他的方法来根据怎么用这些类来设计类。创建一个类来和一些人共事Joe和Bob经常互相借钱。我们来创建一个类来与他们共事。1 我们创建一个Guy类并创建它的两个实例放到一个窗体里面窗体里有两个字段,一个叫做joe(代表第一个人),另一个叫做bob(代表第二个人)。2 我们将会设置Guy对象的现金和名字这两个对象代表不同的人,所以每个对象有不同的名字和不同的现金。3 我们将会给他们现金还会从他们那儿拿钱出来我们将会用每个

18、人的GiveCash()方法来给每个人现金,还会用TakeCash()方法来从他们那儿拿钱。创建你的Guy类的一个对象创建一个新的窗体应用(因为我们要用到一个窗体)。然后用解决方案管理器添加一个叫做Guy的类。确定要做Guy类文件里添加“using system.Windows.Form;”,然后写完这个类。下面是代码:创建一个窗体来和你的guy对象交互Guy类很不错,但是这只是一个开头儿。现在创建一个使用两个Guy实例的窗体。窗体有显示这个人的名字和有多少钱的标签,还有从他们那儿拿钱或给钱的按钮。1 向你的窗体添加六个标签和两个按钮窗体右手边的标签显示人有多少钱。我们还会给窗体添加一个叫做b

19、ank的变量-右手边的第三个标签显示银行有多少钱。你可以自己给标签命名。你可以单击你想要命名的标签来在属性窗体里面修改Name属性。这将会让你的代码易读,因为你的标签名字是“joesCash”,“bobsCash”而不是“label4”,“label5”。2 向你的窗体添加变量你的窗体需要两个人,所以需要两个Guy类型的变量。命名为joe和bob。然后向窗体添加一个叫做bank的变量来存放银行可以给别人或从别人那儿拿来的钱数。3 给窗体添加一个方法来更新标签窗体右手边的并且显示每个人有多少钱和银行有多少钱。所以给窗体添加一个UpdateForm()方法来更新它们-确保方法返回值是void来告诉

20、C#这个方法没有返回值。把这个方法添加到bank变量的下面:4 双击每一个按钮并添加这些代码进去来与对象交互确保左手边的按钮叫做button1,右手边的按钮叫做button2。然后双击两个按钮-IDE就会添加两个方法分别叫做button1_Click()和button2_Click()。向方法内添加下面的代码:5 一开始给Joe$50给Bob$100你自己来通过设置Name和Cash属性来使得Joe和Bob以50和100美元开始。把它写在InitializeComponent()下面。这一句是在窗体初始化的时候只被调用一次的特殊的方法的一部分。做完这些之后,双击按钮几次,确认一个按钮从银行取$

21、10并给Joe,另一个按钮从Bob那儿去$5并存入银行。你自己来通过设置Name和Cash属性来使得Joe和Bob以50和100美元开始。把它写在InitializeComponent()下面。问:为什么上面的解答没有以“Guy bob=new Guy()”开始?为什么没有写“Guy”?答:因为在窗体开始处你已经声明过bob变量了。还记得“int i = 5”这个语句与“int i”和“i = 5”这两个语句是一样的吗?这儿也一样。你可以在一行中来声明bob变量,就像这样:“Guy bob = new Guy()”。但是你已经写了这个语句的前半部分(“Guy bob;”)了。所以现在只需要这一

22、行的后半部分了,就是设置把bob变量设置为Guy实例的语句。问:好。那为什么不把窗体开头儿的“Guy bob;”这一行删掉呢?答:那样的话bob变量就只会存在于“public Form1()”这个方法里了。在方法内部声明变量,这个变量只在方法内部有效-在别的方法里面不能访问。但是如果你在方法外的窗体里或者一个类里声明变量,那么你就可以在该窗体或类的其他方法里面访问这个变量。问:如果我在方法内也写一个“Guy”会怎么样?答:那就麻烦了-你的窗体无法工作,因为窗体的bob变量根本就没被赋值。考虑一下,你就知道为什么会这样了。如果你的窗体开头儿这样写:Public partial class For

23、m1:Form Guy bob;然后在方法里这样写:Guy bob = new Guy();这样你就声明了两个同名的变量了,这有点混乱。一个在整个窗体中可访问,另一个-在方法内部添加的那个-只在方法内部可访问。下一行(bob.Name = “Bob”;)只会更新局部变量,不会触及窗体级的变量。所以运行的时候,你会收到一个讨厌的错误(“NullReferenceException not handled”),意思就是说你尝试在给变量用new语句赋值之前使用它。还有一个更简单的方法来初始化对象基本是你创建的每一个对象都需要被以某种方式来初始化。Guy对象也不例外-在你设置它的Name和Cash字段

24、之前这个对象是没用处的。因为初始化字段值太普遍了,C#给你提供了一个简捷方式,叫做对象初始化器。IDE的智能感应会帮你完成它。对象初始化器只在C# 3.0中可用。如果你在用VS2005,那不行。下载VS 2008 Express Edition吧-它是免费的,它可以和你已经安装的VS 2005共存。1 原本你是这么写代码来初始化Joe Guy对象的。2 删除后两行,还有“Guy()”后面的分号也删掉,再添加一个左大括号。3 敲空格。IDE马上就会弹出一个智能感应窗口,给出所有你可以初始化的字段。4 按tab键来添加Cash字段。然后设置它为50.5 敲一个逗号。马上,就会显示其他的字段。6 结

25、束掉对象初始化器。现在,你省了两行代码!对象初始化器为你节省时间,并使得你的代码紧凑易读.而且IDE会帮你来写。设计直观的类的几个好主意* 你构建程序是为了解决问题花点时间考虑一下要解决得问题。问题容易分解为多个小部分吗?你会怎么给别人描述这个问题?设计类的时候需要考虑很多事儿。* 你的程序会用到什么现实世界的东西?一个帮助动物园管理员管理动物的喂食的程序可能会含有代表不同种类食物或不同种类动物的类。* 给类和方法命名要直观要让别人一看你的类和方法的名字就知道类和方法是做什么的。* 寻找类之间的共同点如果两个类很相似的话,它们可能可以合并为一个类。糖果制造系统可能有三四个涡轮,但是只有一个方法

26、来关闭速闭阀,这个方法取一个涡轮号作为参数。向“Fun with Joe and Bob”程序添加按钮来让两个人给彼此钱。1 用对象初始化器来初始化Guy的对象Bob你已经在Joe身上这么做过了。现在让Bob实例也用对象初始化器创建。2 再向窗体添加两个按钮第一个按钮让Joe给Bob10美元,第二个按钮让Bob给Joe5美元。在双击按钮之前,去属性窗口通过Name属性来修改每个按钮的名字-它在属性窗口窗口的顶部。给第一个按钮命名为joeGivesToBob,第二个按钮命名为bobGivesToJoe。3 让按钮可以工作在窗体设计器里面双击joeGivesToBob。IDE将会向窗体添加一个joeGivesToBob_Click(),它在每次按钮被点击的时候都会运行。填写这个方法让Joe给Bob 10美元。然后双击另一个按钮,并填写IDE创建的bobGivesToJoe_Click()方法来让Bob给Joe 5美元。确保窗体在每次现金转手之后都会更新自己。

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号