欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C#程序设计语言与面向对象基础精简教程.pdf

    • 资源ID:70321876       资源大小:1.08MB        全文页数:58页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C#程序设计语言与面向对象基础精简教程.pdf

    1 C#程序设计语言与面向对象基础精简教程*作者声明:作者声明:(1)本教程为ASP.NET 程序设计教程(高等教育出版社 预计 2009 年 2 月出版)的补充资料,其目的是为学习“ASP.NET 开发技术”的学生打好必要的基础,扫清学习的障碍。(2)本教程主要内容抽取自金旭亮所著之.NET 2.0 面向对象编程揭秘(电子工业出版社,2007 年 6 月出版),此书对 C#2.0 程序设计语言与对象模型、.NET CLR 内部运行机理,.NET Framework 基类库中的核心技术以及 Visual Studio 2005 提供的新特性进行了深入介绍,需要深入了解和把握面向对象理论与技术的读者可以阅读此书。(3)作为本教程的编写者,授权允许读者出于学习目的以各种方式使用、复制和传播本教程的内容及相关示例,但不得将其用于商业目的,作者本人也不对使用这些代码所可能带来的各种问题承担责任。(4)欢迎读者就计算机技术与教学问题与作者进行交流。作者的联系方式:电子邮件:JinXuL 个人博客:(1)http:/ (2)http:/ 金旭亮 2008 年 9 月*目 录 C#程序设计语言与面向对象基础精简教程.11 面向对象技术概论.11.1 结构化程序设计引例.11.2 面向对象的核心概念.71.3 面向对象技术与 Web 开发的关系.92 类与对象.92.1 类的字段.102.2 类的方法.102.3 类的静态成员.132.4 类的属性.162.5 深入理解类与对象.183 命名空间与类库.223.1 命名空间.223.2 类库.234 继承.254.1 继承概念的引入.254.2 类成员的访问权限.264.3 子类、父类变量的相互赋值.304.4 方法重载、隐藏与虚方法调用.312 5 抽象基类与接口.355.1 抽象类与抽象方法.355.2 抽象属性.365.3 接口.376 多态.406.1 继承多态.406.2 接口多态.447 委托.477.1 理解委托的概念.477.2 委托的组合与分解.498 事件.518.1 事件与多路委托.518.2 Visual Studio 窗体事件机制剖析.538.3 小结.561 本教程介绍.NET 平台上主流的程序设计语言 C#,为读者学习 ASP.NET 技术打下基础。C#是一门新设计的语言,它吸收了其前辈如 C+、Java 和 Delphi 等的长处,拥有相当丰富的语言特性。本章仅介绍使用 C#进行面向对象程序设计的基础知识,重点在于讲清楚面向对象程序设计中的一些重要的基础的概念。1 面向对象技术概论 面向对象理论很早就被提出了,但它真正地渗透到软件开发的各个领域,并且在软件开发实践中大规模应用,却始于 20 世纪 90 年代。到目前为止,面向对象技术已是软件开发的主流,全面取代了结构化程序设计技术曾经具有的地位。面向对象程序设计技术与结构化程序设计技术有着不同的风格,但同时也有着密切的联系。从具体程序设计角度来看,面向对象程序设计技术与结构化程序设计技术很难截然分开,两者的根本差别在于思维方式。要了解面向对象技术,得从结构化程序设计技术入手。1.1 结构化程序设计引例 结构化程序设计在 20 世纪 70 年代兴起,由于它具有很多的优点,出现之后没几年就成为了程序设计的主流,大家熟悉的 C 语言就是一种典型的结构化程序设计语言。结构化程序设计的基本方法是“功能分解法功能分解法”,具体来说,就是将要解决的实际问题进行分解,把一个大问题分成若干个子问题,每个子问题又可以被分解为更小的问题,直到得到的子问题可以用一个函数来实现为止。下面先从一个简单的程序设计任务开始,读者可逐步体会结构化程序设计与面向对象程序设计的不同风格。来看以下的这道程序设计题目:请编程计算出1999年5月10日到2006年3月8日期间一共有多少天?这是一个简单的算术问题,尽管如此,为了作个铺垫,还是把计算方法再叙述一下,以帮助读者理清思路。人们都知道以下基本常识:?一年有 365 天,但闰年有 366 天;?一年有 12 个月,大月 31 天,小月 30 天;?2 月最特殊,普通年有 28 天,闰年有 29 天。根据以上基本常识,计算步骤如下:计算从 1999 到 2006 期间共有多少个整年:计算从 1999 到 2006 期间共有多少个整年:2000、2001、2002、2003、2004、2005,共有 6 个整年,其中 2000 和 2004 年是闰年,因此,共有 636522192 天。计算从 1999 年 5 月 10 日到本年底(即 12 月 31 日)共有多少天:计算从 1999 年 5 月 10 日到本年底(即 12 月 31 日)共有多少天:5 月 10 日到 12 月 31 日中共有 4 个整的大月(7 月、8 月、10 月、12 月),3 个整的小月(6 月、9 月、11 月),共记 431330214 天。5 月 10 日到本月底(31 日)还有 311021 天。所以,1999 年 5 月 10 日到年底共有 21421235 天。2 计算从 2006 年月日到 2006 年 3 月 8 日期间一共有多少天:计算从 2006 年月日到 2006 年 3 月 8 日期间一共有多少天:1 月有 31 天,2006 年不是闰年,2 月有 28 天,所以,总共有 3128867 天。综上所述,1999 年 5 月 10 日到 2006 年 3 月 8 日期间一共有 2192235672494 天。事实上,上述计算过程就是一种算法算法(algorithm)。由于步骤很明确,可以很容易地将这一过程转为程序。动手编码之前,先将实际问题抽象为以下模型(见图 1)。图 1 程序的最高层抽象 如图 1 所示,要完成的工作就是开发出这样一个程序:程序接收两个日期值,经过计算之后,输出这两个日期之间的天数。(1)结构化分析过程 为了清晰地表达出程序需要处理的信息,先定义一个结构体类型:/封装日期信息 public struct MyDate public int Year;/年 public int Month;/月 public int Day;/日 结构体类型 MyDate 其实是定义了一种数据结构(data structure)数据结构(data structure)。正是在这个数据结构之上构建出整个程序的。对图 1 所示的模型进行结构化分析的第一步,是将“程序”方框完成的功能转换为由一个函数 CalculateDaysOfTwoDate()实现:/计算两个日期中的整天数 static int CalculateDaysOfTwoDate(MyDate beginDate,MyDate endDate)/余下的开发工作体现为给 CalculateDaysOfTwoDate()编写代码实现日期计算的功能。在结构化程序设计理论中,有这样一个重要的公式:程序数据结构算法 程序数据结构算法 数据结构代表了要处理的信息,而算法则表明要对这些信息进行哪些处理工作。只要确定了数据结构和算法,一个程序就成形了。因此,将程序中要处理的数据抽象为某种数据结构是进行结构化程序设计的基础。将程序中要处理的数据抽象为某种数据结构是进行结构化程序设计的基础。3 在本例中,算法非常简单,可以直接将人计算过程中的每一个步骤转为一个函数,由此得到以下两个函数:/计算两年之间的整年天数,不足一年的去掉 static int CalculateDaysOfTwoYear(int beginYear,int endYear)/根据两个日期,计算出这两个日期之间的天数,忽略中间的整年 static int CalculateDaysOfTwoMonth(MyDate beginDate,MyDate endDate)/第一个函数根据两个年份之间的整年数计算出天数,第二个函数根据月和日计算出两个日期之间的天数(忽略中间的整年)。在深入地考虑这两个函数的具体实现算法时,会发现它们都需要判断一年是否是闰年,于是,设计另一个函数 IsLeapYear()完成此功能:/根据年数判断其是否为闰年 static bool IsLeapYear(int year)/这样,函数 CalculateDaysOfTwoYear()和 CalculateDaysOfTwoMonth()在需要的时候即可调用 IsLeapYear()函数来判断某年是否为闰年。至此设计工作完成,得到了以下结果(见图 2)。图 2 结构化程序设计结果 图 2 展示了结构化分析得到的设计方案,图中的箭头表示函数调用关系。在整个结构化分析过程中,采用的是先设计出最顶层的 CalculateDaysOfTwoDate()函数4 的接口,再设计第二层的两个函数 CalculateDaysOfTwoYear()和 CalculateDaysOfTwoMonth(),最后抽象出第三层的函数 IsLeapYear()。有了设计图,即可动手写代码。现在有四个函数需要开发,如何确定开发顺序?很明显,必须先开发 IsLeapYear()函数,因为此函数被其他函数调用,但它不调用其他函数。接着可以开发 CalculateDaysOfTwoMonth()和 CalculateDaysOfTwoYear()两个函数,因为CalculateDaysOfTwoYear()函数比较简单,所以先开发它。最后开发 CalculateDaysOfTwoDate()函数。上述开发次序的确定可以用两句话来表达:盖楼先打地基盖楼先打地基:先开发最底层的函数,因为不完成开发这些函数,调用它们的上层函数就无法运行。柿子捡软的捏:柿子捡软的捏:在同一层次的函数中,先开发简单的,再开发复杂的。函数开发完成之后,以下代码调用最顶层函数 CalculateDaysOfTwoDate()完成计算两日期之间天数的工作:MyDate d1,d2;/起始日期和结束日期 /1999年5月10日 d1.Year=1999;d1.Month=5;d1.Day=10;/2006年3月8日 d2.Year=2006;d2.Month=3;d2.Day=8;/计算结果 int days =CalculateDaysOfTwoDate(d1,d2);现在可以对结构化程序设计方法做个小结。?结构化软件系统的基本程序设计单位是函数。?整个系统按功能划分为若干个模块,每个模块都由逻辑上或功能上相关的若干个函数构成,各模块在功能上相对独立。?公用的函数存放在公用模块中,各模块间可以相互调用,拥有调用关系的模块形成一个树型结构,这种调用关系应尽可能做到是单向的。结构化软件系统的架构如图 3 所示。5 图 3 结构化软件的架构 结构化程序设计的开发过程可以分为以下 3 个阶段:分析阶段 分析阶段:在程序设计之前,需要仔细分析要解决的问题,确定好数据结构与算法。设计阶段设计阶段:结构化程序设计的基本单元是函数,每个函数都完成整个程序的一个功能,整个设计过程就是函数接口的设计过程,这是一个“自顶向下,逐步求精自顶向下,逐步求精”的过程,将一个大函数不断分解为多个小函数,直至可以很容易用某种结构化程序设计语言实现时为止。编码阶段编码阶段:在开发时,根据在设计阶段得到的函数调用图,先开发最底层的函数,再开发上层函数。这是一个“自底向上,逐层盖楼自底向上,逐层盖楼”的方法。结构化程序设计中“自顶向下,逐步求精”的“功能分解法”,是一种重要的软件开发方法,其本质是一种“分而治之”的思想,在面向对象的程序中也有广泛的应用。掌握这种分析方法,对软件工程师而言是非常重要的。(2)面向对象分析过程 有了结构化分析的基础,可以很容易地将原先结构化的程序转换为面向对象的程序。创建一个 CalculateDate 类,作为上面结构化分析得到的 4 个函数的“新家”,如图 4 所示。图 4 将函数移到类中 由于外界只需要调用 CalculateDaysOfTwoDate()这个函数,所以将此函数设置为公有(public),而其他 3 个函数则成为类的私有(private)成员,外界不可访问.以下为调用此类完成计算两个日期间天数的代码示例:6 MyDate d1,d2;/起始日期和结束日期 /1999年5月10日 d1.Year=1999;d1.Month=5;d1.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(str,d1.Year,d1.Month,d1.Day,d2.Year,d2.Month,d2.Day);CalculateDate obj=new CalculateDate();/创建类CalculateDate对象obj /调用对象obj的CalculateDaysOfTwoDate方法计算 int days=obj.CalculateDaysOfTwoDate(d1,d2);Console.WriteLine(str+days);对比前面结构化的程序,不难发现面向对象的程序具有以下几个特点:所有的函数都放入到一个类中,成为某个类的成员。所以,类是面向对象程序设计的基本单元类是面向对象程序设计的基本单元。外界不能直接调用类的成员函数,必须先创建一个对象,再通过对象来调用这些函数。只有声明为 public 的函数可以被外界调用(本例中为 CalculateDaysOfTwoDate()函数),其余声明为 private 的函数是私有的,外界无法访问。从这个实例可以看出,面向对象程序与结构化程序有着很不一样的风格,但看不出来面向对象有何优越之处。的确,对于这个小实例而言,面向对象程序与结构化程序相比没有明显的优越性,而且显得更麻烦。但如果是大规模的软件系统,则面向对象程序就有着结构化程序不可比拟的优势。简单地说:对于大规模的系统,采用面向对象技术开发可以达到较高的开发效率与较低的维护成本,系统的可扩展性也更好。对于大规模的系统,采用面向对象技术开发可以达到较高的开发效率与较低的维护成本,系统的可扩展性也更好。拿本节的小例子而言,其实.NET Framework 本身就提供了两个类 DateTime 和 TimeSpan可完成同样的功能:DateTime dd1,dd2;dd1=new DateTime(2006,3,8);dd2=new DateTime(1999,5,10);/两个日期对象相减,得到一个TimeSpan对象,Days是这一TimeSpan对象的属性 int ddays=(dd1-dd2).Days;Console.WriteLine(ddays);/结果:对比一下,显然使用.NET Framework 提供的现成类比手工编写代码完成同样的工作开发效率要高得多。.NET Framework 中所提供的现成代码都是以面向对象的形式封装的。实践证明,当需要大规模地复用代码以提高软件开发效率时,面向对象程序设计技术比结构化7 程序设计技术更有效。1.2 面向对象的核心概念 从理论上说,面向对象技术拥有四大基本特性。(1)封装 这是一种隐藏信息的特性。以本节引例来说,类 CalculateDate 将数据结构与算法隐藏在类的内部,外界使用者无须知道具体技术实现细节即可使用此类。封装这一特性不仅大大提高了代码的易用性,而且还使得类的开发者可以方便地更换新的算法,这种变化不会影响使用类的外部代码。可以用以下公式展示类的封装特性:封装的类=数据+对此数据所进行的操作(即算法)封装的类=数据+对此数据所进行的操作(即算法)通俗地说,封装就是:隐藏外界不必知道的东西,只向外界展示调用所必需的东西。在面向对象理论中,封装这个概念拥有更为广泛的含义。小到一个简单的数据结构,大到一个完整的软件子系统,静态的如某软件系统要收集数据信息项,动态的如某个工作处理流程,都可以封装到一个类中。具备这种“封装”的意识,是掌握面向对象分析与设计技巧的关键。(2)抽象 讲到抽象,不得不涉及现代科学技术的基础数学。数学是一门抽象的科学,面对着纷繁复杂的世间万物,数学不理会各种事物的独特特性,而只抽取它们在数量上的特性,深刻揭示了“世间万物”在数量上表现出的共同规律,抽象正是数学的本质特征。数学的一个分支离散数学是计算机科学的根基之一,因此,计算机科学从诞生之日起,就与数学有着密不可分的联系,抽象思维也是计算机科学的主要思维方法之一。在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事物所属的类型,分析它们拥有哪些性质与功能,再将它们抽象为在计算机虚拟世界中才有意义的实体类;在程序运行时,由类创建出对象,用对象之间的相互合作关系来模拟真实世界中事物的相互关联。在从真实世界到计算机虚拟世界的转换过程中,抽象起了关键的作用。(3)继承 真实世界中,事物之间有着一种派生关系,例如,“食品”这一大类中包括“水果”这一子类,而“苹果”又包含在“水果”这一子类中。用图形表示如图 5。图 5 现实世界中的事物派生关系 8 在计算机世界中,以面向对象的观点不仅将上述事物抽象为类,而且将事物之间的派生关系也一并模拟出来,这种关系称为“继承”(见图 6)。图 6 用“继承”模拟现实中的“派生”关系 在面向对象软件系统中,继承除了模拟现实世界中事物关系这一作用,还是一个“重用已有代码而又不破坏已有代码”重用已有代码而又不破坏已有代码”的方法。举例来说,现在要开发一个 B 项目,架构设计师发现以前完成的 A 项目中有部分类完全可以在 B 项目中重用,但需要增强这些类的功能以便适用于 B 项目。如果从 A 项目中直接抽取这些类的源代码并加以修改,虽然可以满足 B 项目的需要,但现在却需要维护两套功能类似的类代码,加大了管理的成本。在这种情况下,选择从 A 项目的类中用继承的方法派生出新类用在 B 项目中是一个可选的方案,既满足了新项目的需要,又避免了大量的重复代码与双倍的代码维护成本。(4)多态 在现实生活中,人们常说:苹果是一种是一种水果(Apple is a kind of fruit)。苹果与水果这两个概念之间其实是一种特性与共性的关系,简称为 IS_A 关系,其特点为:水果拥有的特性,苹果一定有。在前面的小节中用继承模拟了 IS_A 关系,“水果(Fruit)”是基类,“苹果(Apple)”是子类,IS_A 关系可以用另一种方式来表达基类拥有的特性,子类一定有基类拥有的特性,子类一定有。因此,可以把子类看成是一种“特殊”的基类。举个例子,“给张三一个苹果”和“给张三一根香蕉”,虽然是两件不同的事,却可以统一说成“给张三一个水果”。用“给张三一个水果”来指代“给张三一个苹果”和“给张三一根香蕉”,虽然在语义上比较“模糊”,但其适用性更广了,除了“苹果”和“香蕉”,以后还可以是“梨子”、“西瓜”、“葡萄”,都可以用“给张三一个水果”来代表。这种用一个比较抽象的事物来取代具体的事物的表达方法,在面向对象软件中用“多态”这一特性来模拟。在面向对象程序设计时应用多态,可以用一句话来概括:9 用抽象的类编程用抽象的类编程1 1。也就是说,在代码中本应使用某一具体子类的地方使用较为抽象的基类对象,这种方法所带来的好处是多态的代码具有“变色龙”的特性,即在不同的条件下,同样代码可以完成不同的功能。适当地在开发中应用多态特性,可以开发出可扩充性很强的系统。(5)小结 面向对象的四大特性不是彼此独立的,“抽象”和“封装”更多地体现为一种思维方法,主要体现在面向对象系统的总体分析和设计中,“继承”和“多态”则多应用于具体子系统和软件模块的设计与编码过程中,而且“继承”是“多态”的基础。1.3 面向对象技术与 Web 开发的关系 在早期静态网页的时代,网页主要是由 HTML 代码表达的。Web 服务器完成的工作只是应浏览器的请求传送网页,职责单一。除非需要开发 Web 服务器本身,开发以静态网页为主体的网站与面向对象技术并没有什么直接关系。在早期的动态网页技术(如 ASP)出现之后,Web 服务器职责开始变得复杂起来,它不仅仅要完成原先的传送网页的工作,还需要完成在传送网页之前动态生成网页的工作。这时,动态网页多采用脚本语言(如 VBScript 或 JScript 等)来配合 HTML 来开发。脚本语言与标准的面向对象语言相比,一般在语法上有所简化,在功能上也不如标准的面向对象语言强大,并且不支持面向对象的所有特性,同时往往也缺乏高效率的开发工具支持。Java 平台的动态网页技术 JSP 应用 Serverlet 技术突破了网页开发不能使用面向对象语言与工具的限制,网页是由在 Web 服务器运行的 Serverlet 动态生成的,而 Serverlet 本身则使用全面向对象的 Java 语言开发。在 JSP 出现并得到广泛应用不久之后,微软公司于 2002 年推出了 ASP 技术的替代技术ASP.NET,在面向对象的道路上走得更远。ASP.NET 将网页本身看成是一个类,当浏览器向 Web 服务器请求这个网页时,Web 服务器动态创建这个类的一个对象,然后调用它的特定方法生成 HTML 代码,再将生成的这些 HTML 代码发回给浏览器。在开发 ASP.NET 网页时,开发者可以使用 C#/VB.NET 等面向对象的语言,并以与桌面程序一致的“所见即所得”与“事件驱动”开发方式编程。对比老的 ASP 技术,ASP.NET技术的这些新特点,充分说明了微软 Web 开发技术已全面步入面向对象的时代。由于 ASP.NET 技术是完全面向对象的,因此,要想掌握这一技术,必须具备有扎实的面向对象理论基础必须具备有扎实的面向对象理论基础。2 类与对象 从本节开始,介绍 C#面向对象程序设计的基本内容。与使用 C 语言等结构化程序设计语言不一样,使用 C#编程,所有的程序代码几乎都放在类中,不存在独立于类之外的函数。因此,类是面向对象程序设计的基本单元。类是面向对象程序设计的基本单元。1 这里,将“接口”也看成是一种特殊的抽象类,抽象类中可以有非抽象方法,而接口中所有方法都是抽象方法。10 在绝大多数面向对象语言中,一个类都可以包含两种成员:字段(field)与方法(method)。字段与方法这两个概念是面向对象理论的术语,适用于各种面向对象语言。而在各种的具体面向对象语言(如 C#)中,可以简单地这样理解:字段即变量,方法即函数字段即变量,方法即函数。类的字段一般代表类中被处理的数据,类的方法大多代表对这些数据的处理过程或用于实现某种特定的功能,方法中的代码往往需要访问字段保存的数据。在 C#中,定义若干个变量,编写若干个函数,将这些代码按以下格式汇集起来,再起个有意义的名字,就完成了一个类的定义:public|private class 类名 public|private 数据类型 变量名;public|private 数据类型 函数名(参数列表)在上述类的定义中,方括号代表可选部分,而竖杠则代表多选一。声明为 public 的变量和函数可以被外界直接访问。而声明为 private 的变量与函数则为类的私有成员,只能由类自己使用。下面简要介绍组成类的基本成员。2.1 类的字段 字段(field)代表了类中的数据,在类的所有方法之外定义一个变量,即定义了一个字段。在变量之前可以加上 public、private 和 protected 表示字段的访问权限。以下代码展示了在类 Student 中定义的两个公有字段 Age 和 SN,外界可以通过类 Student 创建的对象来读取或设置这两个字段的值。可以在定义字段的同时赋予其一个初始值,如下所示:class Student public int age=18;/年龄 public string SN=1220040110;/学号 2.2 类的方法(1)函数的概念 在程序开发过程中,经常发现多处需要实现或调用某一种公用功能(如选择一个文件),这些功能的实现都需要编写若干行代码。如果在调用此功能的地方重复编写这些功能代码,将会使整个程序中代码大量重复,会增大开发工作量,并增加代码维护的难度。为了解决代码重复的问题,绝大多数程序设计语言都将完成某一公用功能的多个语句组合在一起,起一个名字用于代表这些语句的全体,这样的代码块被称为“函数(function)”函数(function)”。引入“函数”概念之后,程序中凡需要调用此公用功能的地方都可以只写出函数名,此函数11 名就代表了函数中所包含的所有代码,这样一来,就不再需要在多个地方重复书写这些功能代码。函数的出现标志着软件开发进入了结构化程序设计的时代。调用和编写各种函数是程序员在进行结构化程序设计时的主要工作之一。C#中一个函数的语法格式如下所示:返回值类型 方法名(参数列表)语句1;语句2;/return 表达式;下面是一个典型的 C#函数示例:int Add(int x,int y)return x+y;函数需要向外界返回一个值,由 return 语句实现。如果一个函数没有返回值或不关心其返回值,则将其返回值定义为 void。void f()/不返回任何值的函数 语句1;语句2;/return;/在return后写一个空语句 (2)方法的定义与使用 放在一个类中的函数(通常附加一个访问权限修饰符如 public 和 private)称为“方法(method)法(method)”。访问一个方法的最基本方式是通过类创建的对象。例如,以下代码在类 MathOpt 中定义了一个 Add()方法:public class MathOpt public int Add(int x,int y)return x+y;12 则可以通过使用 new 关键字创建类 MathOpt 的对象来访问此 Add()方法:class Program static void Main(string args)/创建MathOpt类的对象 MathOpt obj=new MathOpt();/通过对象调用类的方法,结果保存在局部变量中 int result=obj.Add(100,200);/(3)方法重载 方法重载是面向对象语言(如 C#)对结构化程序设计语言(如 C)的一个重要扩充。请看以下代码:class MathOpt /整数相加 public int Add(int x,int y)return x+y;/浮点数相加 public double Add(double x,double y)return x+y;上述两个函数有以下独特之处:函数名相同,均为 Add。参数类型不同,一个为 int,另一个为 double。这两个同名的函数彼此构成了“重载重载(overload)”关系。重载函数的调用代码:MathOpt mathobj=null;/定义MathOpt对象变量 13 mathobj=new MathOpt();/创建对象 int IResult=mathobj.Add(100,200);/调用类的整数相加方法 double FResult=mathobj.Add(5.5,9.2);/调用类的浮点数相加方法 Console.WriteLine(100+200=+IResult);/输出结果 Console.WriteLine(5.5+9.2=+FResult);/输出结果 注意标为粗体的两个方法的调用语句。传给方法实参为浮点数时,将调用参数类型为 double 的 Add(double,double)方法;传给方法的实参为整数时,将调用参数类型为 int 的 Add(int,int)方法。函数重载是面向对象语言对结构化语言特性的重要扩充,在面向对象的程序设计中应用极广。两个构成重载关系的函数必须满足以下条件:函数名相同。参数类型不同,或参数个数不同。两个构成重载关系的函数必须满足以下条件:函数名相同。参数类型不同,或参数个数不同。需要注意的是,函数返回值类型的不同不是函数重载的判断条件。例如,函数 public long Add(int x,int y)与函数 public int Add(int x,int y)就不构成重载关系,因为这两个函数的实参类型和数目都相同,仅函数返回值类型不同。另外,要注意 C#是区分大小写的语言,因此,如果一个类中有以下两个函数:public long add(int x,int y)public int Add(int x,int y)上述代码可以通过编译并且程序可以运行,但这并不是说这两个函数构成了重载关系。事实上,C#编译器认为这是两个完全不同的函数,彼此之间一点关系也没有!2.3 类的静态成员 类中的函数如果在声明时没有加“static”关键字,则称为类的“实例方法(instance method)实例方法(instance method)”。加了 static 关键字的方法称为“静态方法(static method)静态方法(static method)”。类似的,加了 static 关键字的字段称为“静态字段(static field)静态字段(static field)”。(1)访问类的静态成员的基本方法.NET Framework 提供了大量的静态方法供开发人员使用,最典型的是数学库函数,.NET Framework 将常用的数学函数放到了类 Math 中。例如,以下代码计算 2 的 3 次方:double ret=Math.Pow(2,3);14 对比前面介绍过的类实例方法的调用方式,可以发现静态方法在使用时不需要创建对象,而是按以下格式直接调用:类名.静态方法名(参数列表)类名.静态方法名(参数列表)类的实例方法可以直接访问类的公有静态字段,例如 PI(数学常数)就是 Math 类的公有静态字段,可以被用来计算圆周长:/计算圆周长 double GetPerimeterOfCircle(Double radius)return 2*Math.PI*radius;(2)类静态成员的特性 类的静态成员有一个特殊的性质,先来看一个例子来说明这一点。给类 StaticMembers 增加一个普通的实例方法 increaseValue()和实例字段 dynamicVar(参见示例项目 UseStaticMembers):class StaticMembers public static int staticVar=0;/静态字段 public int dynamicVar=0;public void increaseValue()staticVar+;dynamicVar+;在 increaseValue()方法中,对类的静态字段 staticVar 和实例字段 dynamicVar 都进行了自增操作。以下是测试代码:static void Main(string args)StaticMembers obj=null;/创建100个对象 for(int i=0;i 100;i+)obj=new StaticMembers();obj.increaseValue();15 /查看静态字段与普通字段的值 Console.WriteLine(dynamicVar=+obj.dynamicVar);Console.WriteLine(staticVar=+StaticMembers.staticVar);/程序暂停,敲任意键继续 Console.ReadKey();程序的运行结果如下:dynamicVar=1 staticVar=100 因为类的静态成员拥有以下特性:类的静态成员是供类的所有对象所共享的。类的静态成员是供类的所有对象所共享的。在本节示例中创建了 100 个对象,每个对象拥有 1 个 dyanmicVar 字段,一共有 100 个dyanmicVar 字段,这些字段是独立的,“互不干涉内政”。而 staticVar 字段仅有一个,为所有对象所共享。因此,任何一个对象对 staticVar 字段的修改,都会被其他对象所感知(见图 7)。图 7 静态字段与实例字段 (3)类实例成员与静态成员的访问规则 在面向对象的程序中,对类的实例和静态成员,有以下访问规则:?位于同一类中的实例方法可直接相互调用。位于同一类中的实例方法可直接相互调用。?类的字段(包括实例字段和静态字段)可以被同一类中的所有实例方法直接访问。类的字段(包括实例字段和静态字段)可以被同一类中的所有实例方法直接访问。?类中的静态方法只能直接访问类静态字段。类中的静态方法只能直接访问类静态字段。上述规则中,需要特别注意,在静态方法中直接调用类的实例方法是非法的。例如,以下代码将无法通过编译。class StaticMembers 16 public static int staticVar=0;/静态字段 public static void staticFunc()/静态方法 increaseValue();/静态方法中不能调用实例方法,错误静态方法中不能调用实例方法,错误 dynamicVar+;/静态方法中不能访问实例字段静态方法中不能访问实例字段,错误,错误 staticVar+;/静态方法可以访问静态字段,正确静态方法可以访问静态字段,正确 public int dynamicVar=0;public void increaseValue()staticVar+;dynamicVar+;静态方法中只允许访问静态数据。那么如何在静态方法中访问实例数据?很简单,可以在静态方法中创建对象,通过对象来访问即可。将静态方法 staticFunc()修改如下即可通过编译:public static void staticFunc()/静态方法 /在静态方法中通过对象访问类的实例成员 StaticMembers obj=new StaticMembers();obj.increaseValue();/调用实例方法,OK!obj.dynamicVar+;/访问实例字段,OK!2.4 类的属性 属性是一种特殊的“字段”。先来看一个用于表示学生信息的类 Student:class Student public String Name;/姓名 public DateTime Birthday;/生日 public int Age;/年龄 Student 类中使用公有字段来表达学生信息,这种方式无法保证数据的有效性。例如,外界完全可以这样使用 Student 类:Student stu=new Student();stu.Name=;/非法数据,名字怎能为空?17 stu.Birthday=new DateTime(3000,1,3);/公元3000年出生,他来自未来世界?stu.Age=-1;/年龄必须大于0!在设计类时使用属性属性(property)可以保证只有合法的数据才能传给对象。以 Name 这个字段为例,它要求不能为空。首先,定义一个私有的_Name 字段;private String _Name=姓名默认值;接着,即可定义一个 Name 属性:public String Name get /读 return _Name;set /写,使用隐含变量value if(value.Length=0)throw new Exception(名字不能为空);_Name=value;Name 属性由特殊的读访问器(get)读访问器(get)和写访问器(set)写访问器(set)组成。当读取 Name 属性时,读访问器被调用,仅简单地向外界返回私有字段_Name 的值。当设置 Name 属性时,写访问器被调用,先检查外界传入的值是不是空串,再将传入的值保存于私有字段中。经过这样的设计,以下的代码在运行时会抛出一个异常,提醒程序员出现了错误需要更正:Student stu=new Student();stu.Name=;/非法数据,名字怎能为空?写访问器中有一个特殊的变量 value 必须特别注意,它代表了外界传入的值。例如,以下代码

    注意事项

    本文(C#程序设计语言与面向对象基础精简教程.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开