
c#复习课件更新.pdf
60页本教程介绍.N ET平台上主流的编程语言C#,为读者学习ASP.NET技术打卜基础C#是一门新设计的语言,它#吸收了其前辈如C+、Java和D elphi等长处,拥有相当丰富的语肃特性本章仅介绍使用C#进行面向对象编程的基础知识,重点在于讲清楚面向对象编程中的一些重要而基础的概念1面向对象技术概论面向对象理论很早就被提出T,但它真正地渗透到软件开发的各个领域,并且在软件开发实践中大规模应用,却要等到上世纪九十年代到目前为止,面向时象技术已是软件开发的主流,全面取代了结构化编程技术曾经具有的地位面向对象 技 术 结构化编程技术有着不同的风格,但同时也有着密切的联系从具体编程角度来看,面向对象技术与结构化编程技术很难截然分开,两者的根本差别在广思维方式要r解面向对象技术,得从结构化编程技术入手1.1 结 构 化 编 程 引 例结构化编程在上世纪七十年代兴起,由于它具有很多的优点,出现之后没几年就占据了软件开发的主流,大家熟悉的C语言就是种典型的结构化编程语言结构化编程的雄本方法是“功能分解法”,具体来说,就是将要解决的实际问题进行分解,把一个大问题分成若干个子问题,每个子问题又可以被分解为更小的问题,直到得到的子问题可以用一个函数来实现为止。
我们先从一个简的的编程任务开始,逐步体会结构化编程与面向对象编程的不同风格.请行以卜的这道编程题目:请编程计算出1999年5月10日到2006年3月8日期间一共有多少天?这是个简单的算术问题,尽管如此,为了作个铺举,我们还是把计算方法再叙述下,以帮助读拧理清思路.有以下届本常识:一年有365天,但闰年有366天;一年有12个月,大月3 1天,小月3 0天;2月最料殊,普通年有2 8天,闰年有2 9天根据以上应本常识,计算步骤如下:(1)计算从1999到2006期间共有多少个整年:2000、2001,2002、2003、2004、2 0 0 5,共有 6 个整年,其中 2000 和 2(X(4 年是闰年,因此,共有 6 X 365+2=2192 天.(2)计算从1999年5月1 0日到年底(即1 2月3 1日)共有多少天:5月1()日到1 2月3 1日中共有4个整的大月(7月、8月、1 0月、1 2月),3个整的小月(6 月、9 月、11 月),共记 4X 31+3X 30=214 天5月1()日到本月底(3 1日)还 有31-10=21天所以,1999年5月1 0日到年底共有214+21=235天。
3)计算从2006年元旦到2006年3月8日期间一共有多少天:1 月有31天,2006年不是闰年,2 月有28天,所以,总共有31+28+8=67天综上所述,1999年 5 月 10日到2006年 3 月 8 日期间一共有2192+235+67=2494天事实E,上述计算过程其实就是一个计算机算法(a lg o r i t h m),由于步骤很明确,可以很容易地将这一过程转为程序.编程之前,先将实际问题抽象为以卜模型(图1):输入:_ _ _产 皮 _ _ _ _ _ _ _ _取 输出:两个日期=?/不王仔 7两个日期间的天数图1程序的最高层抽象如 图I所示,我们要完成的工作就是开发出这样一个程序:程序接收两个日期值,经过计算之后,输出这两个H期之间的天数1)结构化分析过程为了清晰地表达出程序需要处理的信息,先定义个结构体类型:封装日期信息public struct MyDate(public int Year;年public int Month;月public int Day;/日结构体类型MyDate其实是定义了 种数据 结 构(data stm ctu ie),我们正是在这个数据结构之上构建出整个程序的。
对 图1所示的模型进行结构化分析的第一步,是 将“程序”方框完成的功能转化为由一个函数 CalculateDaysOfTwoDateQ实现:计算两个日期中的整天数static int CalculateDaysOfTwoDate(MyDate beginDate,MyDate endDate)(/.余卜的开发工作体现为给CalculateDaysOfTwoDateO编写代码实现日期计算的功能在结构化编程中,有这样一个重要的公式:程序=数据结构+算法数据结构代表要处理的信息,而算法则表明要对这些信息进行哪些处理工作只要确定了数据结构和算法,一个程序就成形了因此,将程序中要处理的数据抽象为某种数据结构是结构化编程的基础.在本例中,算法非常简单,可以直接将人计算过程中的每个步骤转为个函数,由此得到以下两个函数:/计算两年之间的整年天数,不足一年的去掉static int CalculateDaysOfTwoYear(int beginYearr int endYear)(/)根据两个日期,计算出这两个日期之间的天数,不理会中间的整年sta tic int CalculateDaysOfTwoMonth(MyDate beginDate,MyDate endDate)(/第一个函数根据两个年份之间的整年数计算出天数,第二个函数根据月和日计算出两个口期之间的大数(不理会中间的整年)。
在深入地考虑这两个函数的具体实现算法时,会发现它们都需要判断一年是否是闰年,于是,设计另个函数Is Le a pY e a r完成此功能:根据年数判断其是否为闰年static bool IsLeapYear(int year)(/)这样,函数 C a lc u la t e D a y s O f T w o Y e a r()和 C a lc u la t e D a y s O f T w o Mo n t h()/i:需要的时候即可调用Is Le a pY e a r Q函数来判断是否某年为闰年至此设计工作完成,得到了以下结果(图2):图2结构化程序设计结果图2展示了结构化分析得到的设计方案,图中的箭头表示函数调用关系在整个结构化分析过程中,我们采用的是先设i HM最顶层的C a lc u la t e D a y s O f IW o D a t e()函 数 的 接Fl,再 设 计 第 二 层 的 两 个 函 数 C a lc u la t e D a y s O f T w o Y e a r()和CalculateDaysOfTwoMonthO 最后抽象出第三层的函数 IsLeapYearO有了设计图,即可动手写代码。
现在行四个函数需要开发,如何确定开发顺序?很明显,必须先开发IsLeapYear函数,因为此函数被其他函数调川,但它不调用其他的函数接着可以开发 CalculateDaysOfTwoMonthOfl 1 CalculateDaysOfTwoYear两个函数,因为CalciilateDaysOfTwoYear()函数比较简单,所以先开发它最后开发 CalculateDaysOfTwoDate上述开发次序的确定可以用两句话来表达:(1)盖楼先打地基:先开发最底层的函数,因为不完成开发这些函数,调用它们的上层函数就无法运行2)柿子捡软的捏:在同一层次的函数中,先开发简单的,再开发复杂的函数开发完成之后,以下代刷调用最顶层函数CalculateDaysOfTwoDateO完成计算两H期之间天数的工作:MyDate dl,d2;/起始日期和结束日期/1999年5月10日dl.Year=1999;dl.Month=5;dl.Day=10;2006年3月8日d2.Year-2006;d2.Month=3;d2.Day=8;计算结果int days-CalculateDaysOfTwoDate(dl,d2);现在可以对结构化编程方法作个小结。
结构化软件系统的基本编程单位是函数帔个系统按功能划分为若干个模块,每个模块都由逻辑上.或功能上相关的若干个函数构成,各模块在功能上相时独立.公 用的函数存放在公用模块中,各模块间可以相”调用,拥有调用关系的模块形成一个树型结构,这种调用关系应尽可能做到是单向的结构化软件系统的架构如图3所示:图3结构化软件的架构结构化编程的开发过程可以分为以下三个阶段:(1)分析阶段:在编程之前,需要仔细分析要解决的问题,确定好数据结构与算法.(2)设计阶段:结构化编程的基本单元是函数,每个函数都完成整个程序的个功能,整个设计过程就是函数接口的设计过程,这 是 个“自顶向下,逐步求精”的过程,将一个大函数不断分解为多个小函数,比至可以很容易川某种程序设计语音实现时为止3)编码阶段:在开发时,根据在设计阶段得到的函数调用图,先开发最底层的函数,再开发匕层函数这是一个“自底向上,逐层盖楼”的方法结构化编程中“自顶向下,逐步求精”的“功能分解法”,是一种重要的软件开发方法,其本质是一种分而治之”的思维方式,在面向对象的程序中也有广泛的应用掌握这种分析方法,对软件工程师而言是非常重要的2)面向对象分析过程有了结构化分析的基础,可以很容易的将原先结构化的程序转为面向对象的程序。
创 建 个C a l c u l a t e D a t e类,作为上面结构化分析得到的四个函数的“新家”,如 图4所Class-字段nonlhs:in t-方法V CalculaiteDaysOfTwoDat e()int券 CalculateDaysOfTolionthO:CalculateDaysOfTwoYear()int,4,V TsLeapYear()bool图4将函数移到类中由 外界只需要调用C a l c u l a t e D a y s O f T w o D a t e O 个函数,所以将此函数设置为公有(p u b l i c),而 其 他:个函数则成为类的私行(pr i va te)成员,外界不可访问.以下为调用此类完成计算两个口期间天数的代码示例:My Date dl,d2;起始日期和结束日期1999年5月10日dl.Year=1999;dl.Month=5;dl.Day=10;2006年3月8日d2.Year=2006;d2.Month=3;d2.Day=8;string str=0 年 1 月 2 日到 3 年(4 月 5 日共有天数:str=String.Format(strr dl.Year,dl.Month,dl.Day,d2.Year,d2.Month,d2.Day);palculateDate obj=new CalculateDate();|创建类Ca 1 culateDate对象obj/调用对象obj的CalculateDaysOfTwoDate方法计算|int days=obj.CalculateDaysOfTwoDate(dl,d2);Console.WriteLine(3tr+days);对比前面结构化的程序,不难发现面向对象的程序具有以卜几个特点:(1)所有的函数都放入到个类中,成为某个类的成员,类是编程的基本单元。
2)外界不能直接调用类的成员函数,必须先创建一个对象,再通过对象来调用这些函数.(3)只有声明为pub l i c的函数以被外界调用(本例中为C a l c ul a te D a ysO f T woD a te O函 数),其余声明为pr i va te的函数是私有的,外界无法访问从这个实例可以看出,面向对象程序与结构化程序有着很不一样的风格,但看不出来面向时象有何优越之处,的确,对于这个小实例而M,面向对象程序与结构化程序相比没有明显的优越性,而且显得更麻烦,但如果是大规模的软件系统,则面向对象程序就有着结构化程序不可比拟的优势,简单地说:对于大规模的系统,采用面向对象技术开发可以达到较高的开发效率与较低的维护成本,系统的可扩展性也更好食本节的小例子而言,其实.N E T F r a m e wor k本身就提供了两个类D a te T i i n e和T i i n e S pa i i可完成同样的功能:DateTime ddl,dd2;ddl=n。












