《C#程序设计》课件全套 刘蕴 第1-15章 NET架构 - ADO.NET数据库操作_第1页
《C#程序设计》课件全套 刘蕴 第1-15章 NET架构 - ADO.NET数据库操作_第2页
《C#程序设计》课件全套 刘蕴 第1-15章 NET架构 - ADO.NET数据库操作_第3页
《C#程序设计》课件全套 刘蕴 第1-15章 NET架构 - ADO.NET数据库操作_第4页
《C#程序设计》课件全套 刘蕴 第1-15章 NET架构 - ADO.NET数据库操作_第5页
已阅读5页,还剩587页未读 继续免费阅读

下载本文档

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

文档简介

.NET架构思政目标:

☞理解学习的重要性,树立正确的职业道德观

☞了解.NET的框架内容,对其发展历史有较清楚的认识,培养探究精神技能要求:

☞理解什么是.NET、C#语言

☞掌握.NET架构的相关知识实践目标:

☞能够知道.NET架构的组成

☞能够制定专业发展目标第1章.NET平台概述.NET优势.NET相关的部分程序设计语言.NET的相关课程.NET的核心组成.NET平台概述微软认为.NET代表了一个环境、一个集合,是作为一个平台来支持下一代互联网的;.NET有编程基本结构,有一组基本的用户服务,能够作用于服务器、客户端等任何地方;.NET是非常有创意的,具备优良的性能。微软公司为适应下一代互联网的发展,还提供了WebService开发平台,适用于网络编程和网络服务。.NET能够让程序通过互联网来相互沟通,共享资源。01PART微软公司logoDOS系统标识.NET标识.NET开发列表.NET框架.NET平台概述146523在.NET之前,有DOS开发平台、Windows开发平台,它们都是互联网开发平台。这些开发平台,以互联网为基础,通过标准的互联网通信协议来相互沟通。其中.NET以全新的开发环境来开发应用程序。在传统的开发环境下,不同程序设计语言之间,代码的相互使用十分困难,无法便捷的实现应用集成。在.NET环境下,程序设计语言之间可以相互使用源代码。一种语言与另一种语言之间还可以通过源代码相互继承。程序设计人员可以通过.NET平台的开发环境根据功能需求的不同,选择不同的语言,这些语言能够相互沟通,实现代码的复用和继承,提升软件的开发效率。.NET平台的开发环境,采用了标准通信协议,应用程序可以在不同平台上得到实现.NET平台概述.NET优势.NET是第三代因特网的高分布式环境下的应用程序开发,实现不同语言和平台的高度交互,基于开放的互联网标准和协议而构建的新一代计算和通信平台。.NET是一款跨语言开发平台,它不是一门编程语言。02PART优良的互操作性.NET提供了与其他语言或技术进行便捷交互操作的能力,减少项目升级和维护的开发成本,可以快速升级到.NET平台。语言无关性.NET具备语言无关特性,是因为CTS(CommonTypeSystem,通用类型系统)和.NET下的“汇编语言”——IL(IntermediateLanguage,中间语言)。IL是一种CPU无关代码,在运行时会编译为本机二进制代码运行,.NET程序跨平台运行的特性就是源于此代码。安全可靠性.NET在设计安全模型时将数据与程序代码做了完善的安全防护。快捷开发特性因为.NET具备上述的特性,所以开发快捷高效。.NET优势.NET相关的部分程序设计语言03PART01020304C++C++继承了C语言的特点,且具有更丰富的开发功能。它常用于系统开发、引擎开发等领域。VB语言VB语言是微软开发的面向对象的程序设计语言,英文全称是VisualBasic。C语言C语言是面向过程的编程语言。C语言可读性好,易于调试,具有丰富的数据类型与运算符。C#C#是微软公司发布的一种面向对象的编程语言,运行于.NET平台。.NET相关的部分程序设计语言.NET的相关课程与.NET开发有关的方向及课程有C#程序设计、SQLServer数据库、ASP.NET应用开发、ASP.NETMVC高级开发、.NET开发综合实战、UML建模与设计模式、软件测试技术等。04PARTC#SQLServer数据库ASP.NETASP.NETMVC高级开发.NET开发综合实战UML它功能强大,简单易学,能完美融合.NET框架下的其他编程语言,因此,自发布以来,深受广大编程爱好者喜爱,并逐渐成为流行的编程语言之一。它是微软公司推出的一种关系型数据库系统。它具有高性能设计,支持Windows图形化管理工具,支持本地和远程的系统管理和配置,主要用于信息管理系统。它是微软公司开发的脚本语言,基于.NET的Web开发平台,具备开发网站应用程序的解决方案。它具有三种不同的编程模式,分别是WebPages、MVC和WebForms。它是ASP.NET三种开发模式中的一种。MVC是一种使用模型—视图—控制器的开发模式,用来设计创建Web应用程序。模型表示应用程序的核心,视图用于显示数据,控制器处理输入。主要是应用.NET相关知识进行综合开发实战。它是标准建模语言,用于支持模型化和软件开发。它有严格的语法和语义规范,采用一组图形符号来描述软件模型。它用于发现软件开发过程中遇到的问题,如测试环境的搭建、测试管理、测试工具的使用等。软件测试是软件开发过程中的重要组成部分,贯穿整个软件开发生命周期。它是任何软件开发都不可缺少的组成内容。软件测试技术.NET的相关课程.NET的核心组成.NET主要由三大部分组成,分别是CLR、BCL和编程工具。05PART030201它是.NET的基础,是实现.NET跨平台、跨语言、代码安全等核心特性的关键。它在.NET程序中负责托管运行管理,完成如内存管理、异常处理、安全检测等核心任务。CLR它是.NET的另一核心,内容丰富。作为.NET框架中的基础类库,这些内置类库的支持,使得程序开发过程变得简单。BCL良好的编程工具应包含VisualStudio集成开发环境、.NET兼容的编译器、调试器和ASP.NET等四方面内容。本书使用VisualStudio作为编程工具。编程工具.NET的核心组成简述.NET框架。一如何理解语言无关性?二如何理解CLR、BCL的作用?三如何理解.NET与C#的关系?四课后练习结束.

感谢聆听开发环境思政目标:

☞通过搭建开发环境练习,正确使用相关开发工具,探究事物规律

☞了解C#的大致内容,培养规范化的编程行为,维护网络安全

☞理解学习的重要性,树立正确的职业道德观技能要求:

☞掌握开发环境的配置

☞掌握VisualStudio的使用方法实践目标:

☞能够正确安装并使用VisualStudio

☞能够创建项目,调试程序第2章VisualStudio的介绍VisualStudio安装与配置工具栏与使用技巧创建项目VisualStudio的介绍MicrosoftVisualStudio是微软公司开发的集成工具。它性能优良,有出色的代码管控工具、集成开发环境,其代码适用于微软支持的所有平台。01PARTVisualStudio的介绍VisualStudio2008它提供了高级开发工具、创新功能,以及数据库功能。它对Web开发工具有大量的改进,性能更加优良。VisualStudio2010它支持WindowsAzure,是微软进入云计算结构的标志。它支持VisualBasic、VisualC#、VisualC++、VisualF#VisualStudio2012它有更简便的优化界面和可视化工具集。它在Web开发工具中增加了新的工具和模板。它继承了ASP,全面支持移动和HTML5。123VisualStudio的介绍VisualStudio2013相较于VS2012,它增加了代码信息指示、身份识别、敏捷开发项目模板、团队工作室等功能。4VisualStudio的介绍相较于之前的版本,VS2019增加了一键清除代码功能,引入实时共享功能。它改进了C++文件的IntelliSense性能,使用多个常用方针程序进行本地开发,简化了解决方案资源管理器中的测试访问。使用者可创建和克隆存储库,管理分支并解决合并冲突。VisualStudio20194VisualStudio安装与配置VisualStudio是功能完备的编程工具,是性能优良的集成开发环境。它是众多编程人员的首选开发工具,适用于Windows、Web、Android以及iOS开发。02PARTVisualStudio安装与配置1.下载软件并安装从微软官网下载的是一个引导程序,并不是VisualStudio。启动后进入可视化安装窗口,点击“继续”按钮,等待安装VisualStudio安装与配置2.选择“工作负载”等待下载并安装工作负载对应不同的类库,适用于不同的开发需求,如.NET桌面开发、C++桌面开发、通用Windows平台开发、.NET的移动开发等。VisualStudio安装与配置3.软件安装成功打开软件

检测其是否正常运行安装成功页面有修改、启动及更多选项,使用者可根据不同需求,修改软件。下一步,点击“启动”按钮,测试软件能够正常运行工具栏与使用技巧VS工具栏中有文件、编辑、视图、Git、项目、生成、调试、测试、分析、工具、扩展、窗口和其他等功能。03PART在VS工具栏中,第一个是“文件”,在文件选项中,可以新建项目、打开已有项目、克隆存储库、启动窗口等在视图选项中,能够打开各种可视化工具,如解决方案资源管理器、团队资源管理器、服务器资源管理器、测试资源管理器、对象浏览器等文件视图工具栏在项目选项中,能够添加类、数据源、新项、现有项、服务引用等,还可以卸载项目、导出模板在调试选项中,能够调试程序、新建断点、设置调试属性等项目调试工具栏在工具选项中,能够连接到服务器和数据库、选择工具箱项、设置命令行属性等在窗口选项中,能够设置窗口布局、创建文档组、关闭所有选项卡等工具窗口工具栏在写代码的过程中,无可避免的会出现一些错误,因此检查错误是程序设计人员必须面对的问题。VS提供了一个十分好的检查错误的功能,在程序编写的过程中能够即时提供错误或者警告信息,在编译运行时如遇到错误会提供错误信息。在这些错误信息中,会提示出错的文件及行号。行号设置方法:选择“工具”选项,点击“文本编辑器”中的C#,勾选行号VS提供四种主题,有深色、浅色、蓝色、蓝(额外对比度),后两种主题区别不大。使用者可根据对颜色的偏好,选择适合的主题。主题设置方法,选择“工具”,在“环境”中选择“常规”,在颜色主题的下拉框中选择主题。设置行号主题VisualStudio使用技巧当写一个比较大的程序时,需要较长时间才能写成。通过设置任务列表,将待完成的任务标记下来,方便下次查找相关任务在相关的任务代码行输入//TODO,任务列表可在“视图”选项中设置,显示在程序下方任务列表任务列表VisualStudio使用技巧创建项目通过创建一个简单的项目,学习VisualStudio的使用。通过运行程序,掌握正确运行软件的方法。04PART04030201打开VisualStudio软件选择登录创建新项目选择项目模板创建项目07060504选择项目模板配置新项目运行程序保存程序创建项目安装VisualStudio一将VisualStudio主题设置为深色主题二练习创建一个新项目三调试初始化程序,保存程序文件。四课后练习结束.

感谢聆听C#程序与数据类型思政目标:

☞通过学习数据类型及转换,培养学生的认真、细致的编程态度

☞通过编程练习,培养学生分析问题和解决问题的能力技能要求:

☞掌握C#基本语法要求

☞掌握C#中的基本数据类型及转换

☞正确理解变量的命名规则,学会使用值类型和引用类型实践目标:

☞通过认识C#基本语法,为深入学习打基础

☞认识变量与数据类型,能够在编程中正确运用

☞熟悉变量的使用,能够在适当场景中使用第3章编写首个C#程序常量与变量数据类型编写首个C#程序01PART我们从一个简单的C#程序开始,去认识C#语言的基本构成。编写程序观察上述程序,分析程序的组成部分。从运行结果可知,代码中的语句被输出到屏幕。整个程序包括usingSystem、namespace、class、Main方法、语句或表达式,以及注释。这些内容构成了一个完整的程序。第一句是usingSystem,using是C#中的关键字,用于在程序中包含System命名空间。第二句是namespaceConsoleApp2,将“namespace”命名为ConsoleApp2类型。第三句是classProgram,声明class类,命名为Program。程序详解第四句是staticvoidMain(string[]args),定义了一个Main方法。它是所有C#程序的入口点,Main方法用来执行类中的动作。应注意的是,每个程序必须带有Main方法。第五句是Console.WriteLine("欢迎来到C#的世界"),这是一条语句。这条语句可以将括号中双引号内的内容原样的输出到屏幕上,而其中的WriteLine即是执行该功能的方法。第六句是Console.ReadKey(),这条语句可以让输出的语句在控制台显示,否则程序会一闪而过。程序详解第七句是/*这是第一个程序*/,这是注释语句。注释中的内容,会被编译器忽略,不会执行。注释有多种方式可以选择。在程序中,经常用到注释。注释是一种备注手段,主要为了方便程序编写和维护人员修改、维护代码。注释方法注释内容并不会被程序编译器运行,即注释不会影响程序运行的结果。在C#中,主要有3种注释方式3.XML注释(///)2.多行注释(/**/)1.单行注释(//)单行注释用于注释文字不超过一行的情况,即短小的注释。注释内容很多时,可采用多行注释,只需要将注释文字放到/*和*/之间即可,且*与/之间不能有空格。注意,多行注释不能嵌套使用。XML注释主要用于方法、属性等的注释,因而调用此注释方法的其他用户也会看到相应的提示,该注释还可以方便地生成开发文档。因为该注释可自动生成部分代码,所以不需要人工输入全部内容。注释方法标识符是用来命名变量、方法、参数等的一种字符串。标识符程序中标识符的位置有规定:数字不能放在首位;字母和下划线随意使用;@字符只能放在标识符的首位;标识符区分大小写,如MyCar与myCar是不同的标识符。需要注意的是,标识符不能与C#的类库名称相同。标识符与关键字关键字是C#编译器预定的保留字,用于定义固定内容。关键字不能用作变量名,也不能用作标识符,关键字应全部小写。关键字关键字分为保留关键字(ReservedKeywords)和上下文关键字(ContextualKeywords)两种,二者有区别。上下文关键字充当标识符,有特殊的含义。标识符与关键字保留关键字标识符与关键字abstractasbaseboolbreakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegatedodoubleelseenumeventexplicitexternfalsefinallyfixedfloatforforeachgotoifimplicitinin(genericmodifier)intinterfaceinternalislocklongnamespacenewnullobjectoperatoroutout(genericmodifier)overrideparamsprivateprotectedpublicreadonlyrefreturnsbytesealedshortsizeofstackallocstaticstringstructswitchthisthrowtruetrytypeofuintulonguncheckedunsafeushortusingvirtualvoidvolatilewhile上下文关键字标识符与关键字addaliasascendingdescendingdynamicfromgetglobalgroupintojoinletorderbypartial(type)Partial(method)removeselectset常量与变量02PART常量常量是指在程序运行过程中,值不改变的量。通常,程序中多次出现且固定不变的值定义为常量。枚举类型使用常量最多。常量的特征(1)常量在程序中只能被赋予初始值,初始值一旦被赋予,该常量在程序运行过程中的值就不会改变。(2)对常量进行定义时,表达式中的运算符对象只允许有常量和常数。常量030201变量的命名变量的命名法变量的赋值变量变量的命名变量名可以包括字母、数字和下画线,但数字不能作为开头。(2)变量区分大小写,这意味着china和China是不同的两个变量。(3)变量名不能与C#中的函数名称、关键字及上下文关键字相同。(4)变量命名虽然支持中文,但并不推荐使用。(5)Unicode代码点可以作为变量标志符,效果同使用相应字符效果一样,但此做法并不推荐。(6)变量先赋值再使用。定义局部变量时可以先不赋初值,使用前必须赋初值。变量(1)变量的命名法Pascal命名法所有单词的首字母大写,如变量MyCar。对于能够从外部访问的成员,如类、属性、事件、公共方法(函数)和公共字段等的命名,采取Pascal命名法。匈牙利命名法该命名法的特点是在变量的名称前面添加数据类型的缩写前缀Camel命名法第一个单词首字母小写,其他单词首字母大写,如变量myCar。对于私有字段、私有方法、方法参数和局部变量等应采取Camel命名法。变量变量的赋值,其实就是将数据保存到变量中的过程。变量的赋值在C#中,变量赋值的格式如下:

变量名=表达式该格式的意义是:将表达式计算后的值赋予变量。这里的等号意思是赋值符号,不同于运算表达式中的等号。在程序中,一个变量可以被多次赋值,变量的当前值等于最后一次给变量所赋的值。在对变量进行赋值时,表达式的值的类型必须与变量的类型相同。字符串类型的变量不能是int类型的数值。变量数据类型03PART04030201整型布尔类型char类型枚举类型数据类型0605隐式类型浮点类型数据类型整型类型说明范围sbyte8位有符号整数-128~127byte8位无符号整数0~255short16位有符号整数-32768~32767ushort16位无符号整数0~65535int32位有符号整数-2147483648~2147483647uint32位无符号整数0~4294967295long64位有符号整数-9223372036854775808~9223372036854775807ulong64位无符号整数0~18446744073709551615数据类型布尔类型数据类型bool类型的变量仅有两个值:true和false。true和false两种状态的转换可以通过“!”运算符来实现无论中文字符、英文字符或者数字都归属于char类型,char类型占两个字节,故最多可以容纳65536个符号,其取值范围为0~65535。char类型的赋值需要以成对单引号标记char类型使用char类型需要注意以下五个方面。(1)给字符变量赋值时,需要使用单引号,且单引号内的字符数有且仅有一个。(2)若某个字符使用双引号则表明是字符串,即使其长度为1也无法赋给字符型变量。(3)虽然char类型本质上为整数,然而其整型数值(即int,long,short,byte,sbyte等类型)却不能直接赋给char类型变量。(4)char类型可以直接赋给int和long型变量(不能赋给short,byte,sbyte类型)。它可以像数值一样参与运算,并将结果赋给int或long型变量。(5)char类型在实际应用中常和string类型一起使用,特别是在需要逐字符判断校验字符串中是否含有不合法字符的场合。数据类型enum枚举类型名称{枚举元素1[=数值1],枚举元素2[=数值2],…}枚举类型被用来表达若干固定值定义了枚举后,则可以使用所定义的枚举类型定义新的变量类型枚举类型数据类型数值0有一个特性:它可以赋给任何的枚举变量,而其他数值则不具有此特性。枚举类型元素的默认值类型为int,在默认情况下,各个枚举元素的值按照定义顺序递增1。为枚举类型元素赋值时,所能赋值的类型只能为byte、short、int、long等整型数值。除上面所讲述的常规枚举外,还有一类标记枚举。标记枚举的实现需要注意如下两个事项:(1)在枚举顶部添加[Flags]标记。(2)各个枚举项的值应符合2的幂指数规律。隐式类型用var声明,var关键字是“万能类型”的定义方式,可以用来声明任何类型的变量,但并不意味着声明之后其类型仍不确定。使用var声明变量的情况下,强制要求在声明的同时给变量赋初值当使用var声明变量后,表面没有给变量赋予某个具体的类型,然而编译器将会根据变量的赋值情况,推断其真实类型。一旦其真实类型被推断,则此后该隐式类型变量不能再作为其他类型使用,故隐式类型变量表面类似JavaScript中的弱类型声明方式,但它仍然属于强类型。使用隐式类型变量时需要注意的问题:(1)var声明的变量,初始值不能为null。(2)var可以用来定义任何数据类型,但在声明的同时需要赋初始值。(3)var不能一次声明多个变量,如“vari=1,j=2;”,这是错误的声明方式。(4)var声明的变量,初始值若为表达式,则表达式中不能包含自身,如“vari=i+1”。(5)隐式类型变量仍为强类型,其具体类型由编译器根据初始化赋值情况来推断确定。(6)var能不用则不用,使用场合多为LINQ。(7)var看似相像于object,实则完全不同。其效率和强类型定义方式一样,无object类型使用时的装箱、拆箱操作。隐式类型数据类型无论中浮点类型,分别是float、double和decimal,float和double都为浮点类型,分别称为单精度浮点型和双精度浮点型;而decimal,一般用于精度要求高的场合。小数类型(decimal)是高精度的数据类型,占用16个字节(128位),主要为了满足需要高精度的财务和金融计算机领域。文字符、英文字符或者数字都归属于char类型,char类型占两个字节,故最多可以容纳65536个符号,其取值范围为0~65535。char类型的赋值需要以成对单引号标记浮点类型数据类型浮点数据类型数据类型类型字节精度后缀标记范围float47f/D1.5×10-45~3.4×1038double815~16d/D5.0×10-324~1.7×10308decimal1629m/M1.0×10-28~7.9×1028由于double是浮点数值类型的默认类型,若使用了一个浮点数,而没有在该数值后面添加后缀标记,则会使感到初学者困惑两个整数相除,除数不能为0,因而decimal类型不能除以0,但此结论在float类型和double类型上并不成立。此外,使用小数时还需要注意精度问题。虽然通常情况下,由于误差过小,程序输出结果并不会受到太大影响,但积累到一定程度后,问题便会逐渐显露理论上,该程序输出的值应该每次递增0.1,然而实际输出结果并非如此01020304数据类型数据类型1.隐式

转换2.显式

转换3.Type.Parse4.Convert5.装箱与拆箱隐式转换可以自动进行,不会丢失数量级,不会引发异常的任何转换都属于隐式转换。典型的隐式转换如int转为long,值不会发生根本性的变化,此种转换最简单,只需要使用赋值运算符即可自动完成显式转换又叫强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型。显式转换可以将一种数值类型强制转换成另一种数值类型Type.Parse的转换对象都为string类,可用于多种数据类型,也可理解为此方法用于将string类型转换为Type类型(Type类型可以为int、float等多种数值类型)Convert是一个转换类,支持多种内置类型,其转换目标是继承自Object的对象,使用频率很高C#中有一类发生在值类型和object类型之间的特殊转换,这便是装箱与拆箱。装箱是隐式进行的,指将值类型转换为object类型;拆箱则是显式进行的,指将object类型转换为值类型。数据类型转换练习本章所有示例代码。一简述数据类型之间的区别二编写程序并运行,使其输出结果为如图所示的金字塔三课后练习结束.

感谢聆听运算符与语句思政目标:

☞加强动手能力,培养实事求是、严谨的学习态度

☞认真修改并测试程序代码,树立新时期下的程序员精神技能要求:

☞熟练掌握程序各种语句

☞掌握C#中的运算符实践目标:

☞根据所学的示例,能够自己实现一个简单程序

☞熟练掌握语句,能够在不同条件下正确使用第4章运算符运算符的优先级流程控制语句运算符运算符是用来标明数值或表达式运算规则的一种符号标记,它所操作的数值称为操作数。01PART表达式就是由运算符和操作数组合而成。根据操作数的个数,运算符可以分为一元运算符、二元运算符和三元运算符。运算符例如,取负(-)、取反(~)、自增(++)和自减(--)都是典型的一元运算符;而四则运算符(+、—、*、/)则是典型的二元运算符;三元运算符仅有一个,那就是条件运算符(?:),可以用来改写简单的if结构语句。运算符算术运算符运算符运算符说明示例+加ints=2012+2015;inti=0,j=1;intk=i+j;—减ints=2012-2015;inti=0,j=1;intk=i-j;*乘ints=2012*2015;inti=0,j=1;intk=i*j;/除ints=2012/15;inti=2020,j=10;intk=i/j;%取模ints=2012%15;inti=2020,j=10;intk=i%j;++自增1inti=2012;intj=i++,k=++i;--自减1inti=2015;intj=i--,k=--i;整型数据的除法运算与数学中的运算略有差别。整数相除时没有问题,两个整数相除时,其结果仍然是整数。运算符算术运算符只要参与运算的操作数中有一个是浮点型,则其作除法的结果也是浮点型。可以对比整数相除时的结果运算符算术运算符此外,还需要特别强调取模运算符(%)。它是用于计算两个操作数相除的余数,其结果为一个非负整数,即使对于非整数除法而言也是如此应注意的是,如果运算结果超过了变量类型的上限,就会造成溢出,所以要学会选用合适的数据类型进行数值计算。运算符算术运算符关系运算符运算符运算符说明运算符说明==等于<小于!=不等于<=小于或等于>大于>=大于或等于关系运算符的运算结果是布尔值,要么为true,要么为false。关系运算符用于比较两个操作数的大小关系,值是比较的结果==与=表示含义并不相同,前者表示相等,后者表示赋值运算符关系运算符赋值运算符运算符运算符说明运算符说明=赋值<<=左移赋值+=加法赋值>>=右移赋值-=减法赋值&=and位操作赋值*=乘法赋值|=or位操作赋值/=除法赋值^=xor位操作赋值%=取模赋值赋值运算符是将右操作数赋给左操作数,赋值后,不仅左操作获得了这个数,整个表达式的结果也获得了这个数。根据这个特点,可以采取串联赋值方式一次给多个变量赋相同的值,进而简化编码过程运算符赋值运算符逻辑运算符运算符运算类型值x&yx和y同时为1时,结果为1,其他情况结果均为0x|yx和y任一个为1时,结果为1,同时为0时结果为0x^yx和y同为0或1时,结果为0,x和y的取值不同时结果为1~Xx为0时结果为1,x为1时结果为0逻辑运算符有&、|、!、^、~、&&、||。其中,&和|执行按位的“与”和“或”,而~和^执行按位的“非”和“异或”。&&和||执行布尔的“与”和“或”,而!执行布尔的“非”。另外,要注意区分位运算和布尔运算。运算符逻辑运算符运算类型值x&yx和y同时为1时,结果为1,其他情况结果均为0x|yx和y任一个为1时,结果为1,同时为0时结果为0x^yx和y同为0或1时,结果为0,x和y的取值不同时结果为1~Xx为0时结果为1,x为1时结果为0将运算数据相应的二进制数据进行的计算即为位运算运算符逻辑运算符运算类型值x&&yx和y同时为true时,结果为true;其他情况结果均为falsex||yx和y任一个为true时,结果为true;同时为false时,结果为false;!xx为true,结果为false;x为false时,结果为true布尔值的逻辑运算结果第一个条件x==1不成立,而第二个条件y==3成立,因为x==1与y==3并不同时为true,所以进行“与”运算的最后结果是false,因此,布尔型的result返回值是false。条件运算符运算符条件运算符是一个三元运算符,由“?”和“:”组成,以条件运算符构成的表达式称为条件表达式。其一般格式如下:操作数1?操作数2:操作数3操作数1的值必须为布尔值。进行条件运算之前,需要先对问号前面的布尔值进行判断,判断其为true还是false。若结果为true,则条件表达式的值等于操作数2的值;若结果为false,则条件表达式的值等于操作数3的值。位运算符运算符位运算符表示对运算对象进行的位运算,可分为按位运算(&、|、~、^)和移位运算(>>、<<)两类,除按位取反运算符(~)为一元运算符外,其他均为二元运算符。位运算的本质是逻辑运算。运算符说明运算符说明&and(与)|or(或)~取反^xor(异或)>>右移位<<左移位位运算符运算符位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1&1=1,1&0=0,0&1=0,0&0=0按位与运算符&10110000

注:首行和首列表示操作数,其他表示运算结果。位运算符运算符位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1|1=1,1|0=1,0|0=0,0|1=1。例如,10010001(二进制)|11110000(二进制)等于11110001(二进制)按位或运算规则

注:首行和首列表示操作数,其他表示运算结果。|10111010位运算符运算符位逻辑取反运算只需一个运算对象,是单目运算符。位逻辑取反运算按位对运算对象的值进行取反运算,即如果某一位等于1,就将其转换为0;如果某一位等于0,就将其转换为1。例如,对二进制的10010001进行位逻辑取反运算,结果等于01101110;对二进制的01010101进行位逻辑取反运算,结果等于10101010。按位取反运算规则

注:首行和首列表示操作数,其他表示运算结果。10~01位运算符运算符位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是,1^1=0,1^0=1,0^0=0,0^1=1,即相同得0,相异得1。例如,10010001(二进制)^11110000(二进制)=01100001(二进制)。按位异或运算规则

注:首行和首列表示操作数,其他表示运算结果。^10101010位运算符运算符位右移运算将整个数按位右移若干位,右移后空出的部分填0。例如,8位的byte型变量bytei=0x65(即十进制101)将其右移3位:i>>3的结果是0x0C(十进制12)。位运算符运算符位左移运算将整个数按位左移若干位,左移后空出的部分补0。例如,8位的byte型变量bytei=0x65(即十进制是101),将其左移3位:i<<3的结果是0x28(即十进制是40)010203自增运算符(++)和自减运算符(--)的使用频率相对较高,它们都具有两种形式:前缀和后缀前缀自增便是++在操作符前面,如++i;后缀自增便是++在操作符后面,如i++。两者都是实现i递增1,即i=i+1。以++i为例,前缀自增的计算方式是:直接将i=i+1,并将和值返回。以i++为例,后缀自增的计算方式是:先将i的初值返回,再完成i=i+1。运算符自增自减运算符初看此结果,或许会认为i没有被递增,其实i已经被递增。根据上述计算方式,将i++输出时,先将i的原值12返回,交给Console.WriteLine进行输出,所以输出12,这之后才完成递增,而++j则将j由12递增为13,然后才返回并交给Console.WriteLine进行输出,故输出13。运算符从上面的叙述可以推测,若再增加一次i的输出,将会输出13,表示i的确已经被递增了运算符自增与自减运算一般用于整型数据类型变量,事实上,除用在整型数据类型变量外,这两种运算方式同样可以用在其他数据类型上面,如浮点类型运算符的优先级02PART常见运算符的优先级运算符的优先级运算符类型运算符初级运算符(),[],x.y,++(后缀),--(后缀),new,sizeof,typeof,checked/unchecked一元运算符!,~,++(前缀),--(前缀),(T)x乘除、取模运算符*,/,%增量运算符+,-移位运算符<<,>>关系运算符<,>,<=,>=,is,as等式运算符==,!=逻辑与运算符&逻辑异或运算符^逻辑或运算符|条件与运算符&&条件或运算符||条件运算符?:赋值运算符=,*=,/=,+=,-=,<<=,>>=,&=,^=,|=,%=流程控制语句03PARTif-else语句if语句是最常见的程序流程控制语句,它可以配合else或者elseif来无限扩展选择执行的分支。if语句的使用形式有如下四种,但无论采用哪种方式,无论产生多少分支,最终,也只有一个分支能够得以运行。(1)一个分支:if(条件){语句序列;}。(2)两个分支:if(条件){语句序列;}else{语句序列;}。(3)多分支:if(条件){语句序列;}elseif{语句序列;}…else{语句序列;}。(4)嵌套:if(条件){if语句序列;}else{if语句序列;}。其执行机制是:先对各个条件进行判断,然后执行成立条件的分支所对应的语句序列,若没有条件成立,则直接执行整个if块后的语句。流程控制语句流程控制语句若根据要求输入“男”,程序自然能够成功运行,此时输出为“先生,你好!”。若用户输入除“男”外的其他内容,则上面的程序都将把客户视为女性,输出结果自然不符合要求,流程控制语句修改程序如下switch语句switch语句与if语句类似,也是在众多分支中选择一个匹配的分支来执行其执行机制是:根据表达式的值,在各个case中寻找相匹配的,若找到,则执行相应的语句序列直到遇到break,若没有,则在default分支存在的情况下,执行default分支。使用switch时需要注意如下事项。(1)switch表达式的值只能是整型(byte、short、int、char等)、字符串或枚举(枚举可以视为整型的特例)。(2)单个case下不能缺少break,但几个case共用一段语句序列时,可以省略break。(3)switch语句同if语句一样,可以嵌套。流程控制语句流程控制语句实例程序流程控制语句case对应的语句块相同时,可以省略break。例如,上面根据用户输入的性别的示例,若用户输入“男”或“女”,程序输出“您好”,否则输出“错误信息”。两种合法性别对应的case块,共用一个输出for语句for语句是最常使用的循环语句,特点是使用方式的灵活for(初始化语句;条件测试语句;迭代语句){

循环语句序列//循环体,该处的语句序列会被反复执行至循环结束}流程控制语句初始化语句多用于给循环变量赋初值(循环变量多指计数器);条件测试语句多用于判断循环是否需要继续执行,为true时继续,否则不再继续;迭代语句多用于实现对循环变量值的更改,该更改使得循环变量的值向使循环结束的趋势变化。流程控制语句其执行机制是:首先,执行初始化语句;其次,执行条件测试语句,当条件测试语句返回true时,接着执行循环语句序列;最后,执行迭代语句,这是第一次循环的过程,除第一次循环,其他时刻不再执行初始化语句。从第二次循环开始,每次首先执行条件测试语句,成立则执行循环语句序列,再执行迭代语句,然后又进入下一轮循环的条件测试语句判断,直至该语句不成立时,整个循环方才结束。迭代语句除了使用自增表达式外,也可用其他方式流程控制语句for循环的变体很多这两个示例,第一个取消了迭代语句部分,第二个将初始化语句部分和迭代部分都取消了,程序仍可以正常运行,但如果将3个部分都取消,只留下循环语句序列部分,则程序会构成一个死循环流程控制语句当循环变量仅仅用于循环计数时,不可使用下面的写法最好方式是将循环变量i的作用域限制在for循环的结构内部for语句的一般形式,也可以改写为while语句。其对应的初始化语句while语句while语句一般形式while(条件表达式){

循环语句序列;}其执行机制是:首先执行条件表达式,若为真则执行循环语句序列,接着再执行条件表达式,直到条件表达式不成立退出循环为止,继而执行循环体之外的语句。当条件表达式第一次就不成立时,此时循环语句序列不会获得任何执行机会。流程控制语句初始化语句多用于给循环变量赋初值(循环变量多指计数器);条件测试语句多用于判断循环是否需要继续执行,为true时继续,否则不再继续;迭代语句多用于实现对循环变量值的更改,该更改使得循环变量的值向使循环结束的趋势变化。流程控制语句用100以内的奇数等差数列为例进行说明do-while语句do-while语句与while语句基本一样do{

循环语句序列;}while(条件表达式)其执行机制是:首先执行循环语句序列,然后执行条件表达式,若为真则接着执行循环语句序列,接着再执行条件表达式,直到条件表达式不成立退出循环而执行循环之外的语句。从其执行机制可以看出,do-while与while的区别在于,do-while语句中的循环语句序列至少会获得一次执行机会。流程控制语句流程控制语句用100以内的奇数等差数列为例进行说明do-while语句与while语句比较,似乎并无区别,但若赋予i不小于100的初值(赋值应为整数,如1000),再执行上面两段程序,则会看到while语句对应的程序不会有任何输出,而do…while语句则会输出1000。break语句break语句可强行退出循环,即将程序的执行流程从循环内转到循环外流程控制语句由上面示例可以看出,i=3时,满足if的条件,所以break语句被执行,因而导致程序跳出循环,后面的数值便无法输出流程控制语句存在多层循环嵌套时,break语句不是跳转到所有循环的最外面,而是仅仅跳出其所在的循环从结果可以看出,内层循环因使用break语句所以结束,而外层循环却不受影响,仍然执行了3次。练习本章所有示例代码。一简述各语句的特点。二假设在程序中a、b、c均被定义成整型,所赋的值都大于1,则下列能正确表示代数式1/abc的表达式的是()。A.1.0/a*b*c

B.1/(a*b*c)C.1/a/b/(float)cD.1.0/a/b/c三(1)从键盘上输入三个整数,由用户回答它们的和、差、积、商和取余运算结果,然后统计出正确答案的个数。(2)请利用本章所学内容,找出所有介于10~1000之间的偶数(使用for、while、do…while3种循环分别实现)。四课后练习结束.

感谢聆听数组思政目标:

☞逻辑是代码设计中的关键,通过学习数组,加强逻辑思维能力

☞通过编程训练,培养动手能力及团队协作能力技能要求:

☞掌握数组的基本概念、声明及初始化

☞了解数组的访问与遍历

☞了解数组的Array类

☞理解并掌握索引器的定义和使用实践目标:

☞能够在编程中熟练使用数组

☞能够对数组进行基本的操作,为以后的编程做铺垫第5章数组声明和初始化访问元素数组的基本操作声明和初始化01PART数组是一个数据结构,用来存储相同类型元素。其中,需要说明的有以下两点。(1)数组分为一维和多维,其访问方式由相同数组名称和不同索引来实现。(2)元素的类型可以是引用类型或者整型这些基本类型。声明和初始化声明和初始化在数组的分类中,一维数组的使用最普遍,其一般声明方式如下:类型[]数组名称=new类型[数组大小];数组的声明声明和初始化该声明中,需要注意“=”左侧的中括号位置。另外,类型可以为各种数据类型,数组大小指明了所能容纳的元素个数,数组的索引是从0开始的数组的声明声明和初始化类型[]数组名称;数组名称=new类型[数组大小];例如,声明一个整数类型数组,数组共4个元素数组的声明声明和初始化在某些场合下,需要使用高维数组,其一般声明方式如下:类型[,,…,]数组名称=new类型[第一维大小,第二维大小,…,第N维大小];例如,声明一个二维数组,数组共30个元素数组的声明声明和初始化声明数组,是为在其中存放数据,在使用数组前,都需对其进行初始化。若一个数组没有初始化,只进行了声明,其中存放的数据会如何?数组的声明声明和初始化声明数组,是为在其中存放数据,在使用数组前,都需对其进行初始化。若一个数组没有初始化,只进行了声明,其中存放的数据会如何?数组的声明声明和初始化数组元素的默认值是有规则的,其规则如表所示。声明和初始化数组元素默认值数值类型0字符类型0枚举类型0布尔类型False引用类型null数组的初始化一般采用如下方式:类型[]数组名称=new类型[数组大小]{与数组大小相等个数的元素值列表};数组的初始化声明和初始化初始化时,初值的个数必须与数组大小相等,否则会出现编译错误数组的初始化声明和初始化在C#中还有一种特殊的二维数组,即锯齿数组。该种声明方式不能跨语言,否则违背公共语言规范,不推荐使用。数组的初始化声明和初始化访问元素02PART数组的访问是通过数组名和索引来进行的,其中,索引从0开始。该代码的作用是通过数组名和索引将数据存入数组中访问元素读取数据访问元素若想访问数组元素,除上述方式外,还可以通过循环遍历,且循环遍历更为常用。进行循环遍历时,为避免数组访问出现越界错误,需要借助数组的Length属性访问元素数组遍历——for循环访问元素数组遍历——foreach访问元素数组复制一些场合中,我们需要使用数组复制联系相关数组。复制的一种情况是将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。另外一种情况是已经复制的数组有自己的存储空间。从执行结果中可以发现:对iDes1和iDes2中的元素进行输出时,两种数组复制方式的结果相同,即都成功完成了复制;但源内容发生改变后,再进行输出,iDes1结果发生改变,而iDes2仍不变。造成这种结果的原因在于:使用iDes1=iSrc完成的复制,赋值的是引用,本质是令iDes1与iSrc指向相同的存储空间,故随着iSrc的改变,iDes1也会发生相同的改变;而iDes2则具有自己的存储空间,所以在复制完成后,它便不再受iSrc的影响。访问元素数组复制根据提供的一系列数值,求其和值、最大值、最小值访问元素数组参数数组的基本操作03PARTArray的常用属性数组的基本操作Array类属性作用Length32位整数,表示所有元素个数LongLength64位整数,表示所有元素个数Rank获取Array的维数(秩)IsFixedSize总是trueIsReadOnly总是falseArray的常用属性实例数组的基本操作Array类Array的常用方法数组的基本操作Array类方法作用Clear()将元素设置为默认输出值0或nullClone()复制数组Copy()将当前一维数组复制到指定的一维数组中GetLength()获取数组指定维的元素个数GetLowerBound()获取数组中指定维度的下限GetUpperBound()获取数组中指定维度的上限GetValue()获取当前数组中指定元素的值Reverse()反转给定的一维数组元素的顺序SetValue()给当前数组中的指定元素赋值IndexOf()某个值在数组中首次出现的索引Sort()对数组元素进行排序CreateInstance()根据提供的参数创建一个Array类的新实例,即动态创建数组Array的常用属性数组的基本操作Array类属性作用Length32位整数,表示所有元素个数LongLength64位整数,表示所有元素个数Rank获取Array的维数(秩)IsFixedSize总是trueIsReadOnly总是false数组的基本操作Array的方法演示数组的基本操作从程序的执行结果可以看到:(1)CreateInstance(Type,Length)用于创建指定类型和大小的数组。(2)SetValue(value,index)用于给数组的索引为index的元素赋值value。(3)GetValue(index)获取数组的索引为index的值。(4)Array.Copy(arrSrc,arrDes,Length)将源数组的前Length个值复制到目标数组中。(5)myArr.CopyTo(arrDes,index)将myArr复制到arrDes中,目标位置从index开始。(6)Copy和CopyTo方法完成的复制,源数组的改变不会影响目标数组。(7)Array.Sort(myArr)将myArr的元素按照升序排列。(8)Array.Clear(myArr,2,3)将myArr数组从index=2的位置开始,对3个值清零。索引器是一个与属性很类似的类成员,可以具有get和set两个访问器,分别用于实现读和写的功能。索引的主要不同之处在于:定义索引器时一定要使用this关键字,而不需要像定义属性一样要程序编写人员定义一个属性名字;索引器一定需要参数;索引器不能定义为static。索引器主要用于为封装在类内部的数组或者集合提供一种类似于数组的访问方式,类似于上述string示例的访问方式。这样,索引器同时兼具属性的特性和数组的便利访问特性。索引器是比数组更聪明的一类数组,或者说是像数组一样有访问的属性。另外,可以用索引器对集合进行封装。数组的基本操作索引器索引器定义的一般形式如下:访问修饰符类型this[参数列表] { get{//返回参数所指定的元素值} set{//给参数所指定的元素赋值} }数组的基本操作索引器下面的示例将在类内部定义一个int型数组,然后以索引器完成对该数组的封装访问。由于该数组定义为int类型,而索引器的目的就是实现对该数组的访问,故索引器的类型也应该定义为int类型数组的基本操作索引器数组的基本操作索引器观察上述代码不难发现索引器的特性。由于对index的判断,避免了数组的越界错误。不过这也带来一个问题,用户如果访问越界,异常不再触发,用户不知道已经越界。为避免出错而不知的情况,程序采用了另外一种机制来弥补这个缺陷。通过IsSuccessful字段来告知调用结果是否成功。调用演示代码数组的基本操作索引器练习本章所有示例代码。一简述数组和索引器的区别。二随机生成20个整数,并且这20个随机数的正负性也随机处理,然后将这20个随机数存入数组,最后将这20个随机数中的正数存入另外一个数组。三课后练习结束.

感谢聆听类和方法思政目标:

☞理论来源于实践,通过实践操作,激发对编程的兴趣

☞通过面向对象程序设计方法的学习,提高抽象思维能力技能要求:

☞掌握面向对象程序设计的基本概念

☞了解类与对象、字段、属性、方法的概念及用法

☞理解并掌握Main()函数和static方法的用法实践目标:

☞根据示例,对所学的概念进行验证

☞熟练应用面向对象方法实现编程设计

☞能够通过练习进一步认识面向对象设计方法第6章类与成员类方法类的派生类与成员01PART面向对象是一种软件开发方法,它的三大基本特征如下类与对象(1)封装。它将数据及对数据的操作封装为一个有机不可分割的整体,对外隐藏具体实现细节,从而实现可重用、易维护等优秀特性。(2)继承。子类从父类获得父类特征,同时也可以扩展自己新的特征。继承也能实现代码重用。(3)多态。多态性意味着有多重形式,往往表现为“一个接口,多个功能”。类是面向对象最基本、最重要的概念,它定义了数据及对数据所做的操作,带有一定的封闭性。类与成员类属于抽象概念,是对象的模板;对象属于具体概念,是类的具体化表示,对象会被分配物理内存。类一般的定义方式如图6-1所示。应注意的是,成员类型不同,则定义方式不相同。类与对象类与成员类的定义方式类与对象类与成员实例化的操作方式是:借助关键字new,从类中获得对象字段类与成员字段即类中的常量或者变量,它使类具备封装数据的能力。字段的声明方式即变量的声明方式,常用方法是将字段声明为private,然后通过属性、方法等来访问其内容。private声明的字段在该类或者该类的实例化对象外无法直接访问,若希望直接访问,可使用public声明的字段,其访问方式是在类名或者实例化对象名后面通过“.”来访问字段类与成员上面的示例可以看到字段的定义方式、字段修饰符(private和public)的作用、字段的使用以及类与对象的关系。同时,也可以使大家更深刻的理解类的抽象和对象的具体,以及类的封装特性和抽象特性。上面出现的star类实例化后得到不同的对象,但是对象在类的抽象层次上是一致的,即都包含姓名和年龄。属性类与成员常规属性常规属性需要具体的实现get(读访问器)或者set(写访问器),而且一般需要有一个字段与之相对应属性类与成员常规属性属性类型取决于get和set:get和set同时具备时,该属性是一个可读可写属性;只有get时称为只读属性;只有set时称为只写属性。可以根据实际情况决定这两个访问器的取舍。类与成员常规属性示例类与成员常规属性示例属性类与成员自动属性自动属性简化了封装数据字段的过程,减轻了定义私有返回字段和相关属性成员的工作,即在该方式下,无须定义一个相应的私有字段,也不必要写“return…”和“…=value;”这两个语句方法类与成员方法的定义与使用(1)访问修饰符可以取public、private、internal和protected等,常用的有public和private。当private修饰的方法在类或者对象外无法直接访问时,可使用public修饰(2)方法的返回值类型根据实际需要拟定,可通过return关键字实现,无须返回值时应使用void。(3)方法名是一个有意义的标识符,需要描述出方法的用途。(4)方法参数列表可为数组。(5)方法体包含了调用方法时实际执行的语句。方法类与成员方法类与成员上面方法虽然实现无返回值,但是其内部的输出方式并不合适。现在需要将它修改为有返回值的方法,下面的代码仅给出方法的定义和调用部分程序的执行结果不变。这个示例中,Introduce()方法有返回值,其返回值是字符串类型。此时Introduce()方法仅将信息准备好,然后由调用方完成信息的输出方法类与成员方法像是一个工厂,根据提供的原材料生产产品供外部使用。通过有参的方法来处理数据程序的运行结果同上例。这个例子中不需要属性,也可以完成对数据的处理,该程序还存在一个年龄非法的问题,只需在方法内部加入适当的检测代码即可。上面的例子演示了属性和方法一同完成程序的过程:先用属性存储基本数据,然后通过方法的操作把这些数据变得有价值,最后经过方法将加工后的产品送出,这就是封装。封装的优势是调用方不需要在意产品加工过程。封装是将数据和操作融为一个有机整体。类通过字段存储数据,通过属性完成对字段的访问,通过方法来对数据进行操作,然后将操作得到的结果交给调用方。方法类与成员方法的重载重载的构成需要方法满足如下条件:(1)方法名相同。(2)方法名之外的其他方法签名指标不能完全相同。(3)返回值不属于方法签名的内容,所以不能通过返回值的不同来实现重载。(4)不能通过static来实现重载,即若两个方法一样,仅一个为static,一个为非static,两个方法无法构成重载,也无法通过编译。方法类与成员方法的重载方法的重载可以将两个Introduce()方法都保留在star类中方法类与成员参数的个数不定问题——paramsparams可以用于方法参数个数不定的场合,且调用方式灵活从该例可以看出:params是应对参数不定问题的好方法。上面示例中定义了一个数组并且将数组作为参数传递。params关键字使用时,需要注意以下三点:(1)一个方法中最多只能出现一个params。(2)当参数为params修饰时,要防止外界传入非法参数,如null。(3)params只能放到所有参数的最后面,即params修饰的参数后面不能再有参数。方法类与成员this当参数与类的字段重名时,代码虽然没有错误,编辑器却会出现警告方法类与成员this显然,输出结果存在问题,此问题解决方法也很简单,使用this关键字即可,this关键字用于指示当前对象“自己”。将上面的代码用this进行改写方法类与成员this显然,输出结果存在问题,此问题解决方法也很简单,使用this关键字即可,this关键字用于指示当前对象“自己”。将上面的代码用this进行改写类方法02PARTMain()函数类方法Main()函数也称Main()方法,它是一种特殊的方法。其特殊之处如下:(1)Main()函数是可执行程序的入口点,且是唯一的入口点。(2)Main()函数可以带一个字符串数组参数,也可以不带参数。(3)Main()函数一般为void类型的,也可以声明为int类型。(4)Main()函数可以声明为static,也可以声明为非static类型。(5)应用程序的执行在Main()中开始,也在Main()中结束,对应的线程为主线程。参数传递演示Main()函数类方法编译上述程序为dll或者exe。本示例编译得到MainTest.exe(注意上述程序中要将类和Main()方法声明为public),然后新建一个标准项目,接着添加对刚刚生成的MainTest.exe的引用返回值演示Main()函数类方法将程序编译为MainTest.dll,注意当Main()方法为非static时,是无法编译为exe的,然后新建一个标准项目,引用MainTest.dll非静态Main()函数演示由于在MainTest中,Main()函数声明为非static的,故使用时需要先实例化Static类方法类的成员类型分为静态的和非静态的,因而方法也分为静态方法和非静态方法(即实例方法),使用static的方法是静态方法,没有使用的就是非静态方法。静态方法和非静态方法的区别是:静态方法属于类所有,非静态方法属于用该类定义的对象(实例)所有。是否使用static可以在访问方式上直观体现出来。除了构造函数外,其他成员的访问方式有如下特点:使用static时,通过类名和“.”即可访问;未使用static时,通过类的对象和“.”来访问。Static类方法static成员被类的所有实例对象共享,因此,它可以用于同一个类的多个对象之间通信。static变量(也常被称为类变量)的默认值规则为:数值类型的默认为0;布尔类型的默认值为false;引用类型的默认值为null。static修饰构造函数时,该构造函数称为静态构造函数。Static类方法Static类方法从执行结果可以看到:(1)静态构造函数在创建类的实例化对象之前执行且仅执行一次,而普通的构造函数需要实例化一次就执行一次。(2)程序两个属性的赋值初始化都是在构造函数中完成。(3)普通构造函数在实例化时才会执行,普通方法则需要在实例化之后才能通过实例化对象来调用。(4)静态属性及静态方法都需要用类名来访问,若用实例化对象,则访问无法成功。Static类方法使用static时还需要注意如下九点。(1)静态方法中不能直接使用非静态成员,因为非静态成员与实例相关,可以通过对象(即“对象.非静态成员”方式)间接使用,但非静态方法中可以使用静态成员。(2)静态构造函数一定是无参数。(3)静态构造函数不可继承,也不能被直接调用。(4)当静态构造函数和实例构造函数同时存在时,首先调用静态构造函数。(5)静态构造函数不能使用访问修饰符,如public、private都不能使用。(6)类的静态构造函数在给定应用程序域中至多执行一次,只有创建类的实例或者引用类的任何静态成员才会激发。(7)如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助自动生成一个静态构造函数来让自身调用。(8)如果类中包含程序入口的Main()函数,则该类的静态构造函数将在调用Main()函数之前执行。执行类的静态构造函数时,要按照代码顺序执行那些被初始化的静态字段。(9)一个类可以同时拥有实例构造函数和静态构造函数,这是唯一可以具有相同参数列表的同名方法共存的情况。构造函数与析构函数类方法构造函数(也叫构造方法)是一类特殊的方法,它与普通方法的不同之处体现在以下五个方面。(1)构造函数的函数名称必须与类名相同。(2)构造函数可以带参数,但不能有返回值。(3)构造函数可隐式匹配,不能显式调用。当有多个构造函数共存时,将由实例化时所传入的参数情况而自动匹配最佳的构造函数。(4)如果没有给类定义一个构造函数,系统就会自动生成一个无参构造函数。若有自行编写的构造函数,无论其是否带参数,系统都不会再自动生成。(5)构造函数是在实例化类时执行,即通过new来隐式调用,故常在构造函数中做初始化工作。构造函数构造函数的访问修饰符一般为public,根据需要,也可以选择其他访问修饰符。前面讲解方法和属性时,程序通过属性赋值指定类的实例化对象的信息,通过方法将信息做适当处理后输出。下面将使用构造函数来完成类似功能构造函数与析构函数类方法构造函数从上述内容可以看到,构造函数的执行时机是类被实例化时,此时,系统会自动根据用户实例化时的情况调用与之匹配的构造函数。构造函数与析构函数类方法析构函数用于程序的收尾和善后处理工作,从内存释放类实例所占用的资源;构造函数则用于程序的初始化工作。析构函数的特殊性表现在以下四个方面:(1)析构函数的名字与类名相同,但它前面需要加一个浪形符号,即“~”。(2)析构函数不能带参数,也没有返回值。(3)析构函数不能被继承,也不能被重载。

(4)撤销对象时,会自动调用析构函数。析构函数如果用户没有编写析构函数,编译系统会自动生成一个默认的析构函数,该析构函数没有任何操作,所以许多简单的类中并没有定义显式的析构函数。类的派生03PART继承类的派生继承是在现有类(父类)上建立新类(子类)的处理过程,它使子类自动的获得父类所具备的特性,这使得创建和维护应用程序变得更容易。声明一个star类,包含Name属性、Age属性和Introduce方法继承类的派生再声明一个singer类通过比较上面的两个类,可以看到,两个类虽然不一样,但却具有很多相同的代码,逻辑上两者也有一定的关系,singer类具备star类所有的特性,这正是继承的典型特性继承类的派生接下来就利用继承的特性来对singer类进行改写继承类的派生程序运行结果验证了singer类继承了star类的属性。程序虽然顺利执行,但忽略了一个问题:现在是singer类,一个singer的自我介绍还应包含一个代表歌曲。把这个介绍放到Introduce中的方法很简单,只需要把Introduce()方法按照自己的要求重新写一遍即可多态类的派生讲多态前,先来看个继承的例子。首先看基类该类派下衍生两个子类多态类的派生两个子类的输出很明显存在问题,其表达形式应该更贴切一些,如singer输出“我是一个歌星!”,而filmStar输出“我是一个影星!”多态类的派生从该上例中可以看到:如果子类和父类有同名成员,则子类成员将会隐藏从父类那里继承而来的同名成员。若期望子类的方法被执行,且父类的同名方法不被隐藏也得到执行,可以在子类方法中通过base关键字来调用父类同名方法多态类的派生警告的问题,解决方法是使用new关键字,此时的new关键字表示子类明确地声明它要隐藏继承过来的同名方法。改写后的代码如下,此时的执行结果与不加new关键字一样,区别是没有了警告信息。调用代码s和sr分别是父类(star)和子类(singer)对象的引用,先后让s指向singer对象和filmStar对象的引用多态类的派生s明明指向了两个子类引用,但从上面的输出结果中发现,其输出却是完全与父类引用一致,这明显和期望结果不一致,所以仍需进行改进改进方法即本节所要讲的多态。实现多态的办法是:在类中某个方法前面用virtual关键字进行修饰,则表示该方法可以在子类中被改造加工(重写),当然也可以不改造加工,因此,可以在不同子类中加override关键字对该方法进行重写来实现多态的效果。使用virtual声明的方法称为虚方法。多态类的派生仍旧使用上面的调用代码从结果可以看出,虽然使用了同一个引用s来调用一个同

温馨提示

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

评论

0/150

提交评论