C#从入门到精通(第2版)

978-7-115-38357-0
作者: 龙马高新教育 国家863中部软件孵化器
译者:
编辑: 张翼
分类: C#

图书目录:

详情

本书面向C#的零基础读者,介绍基础入门知识和实际操作技巧。全书紧贴软件开发的实际需求,首先向读者展示语言的背景知识和应用范围,之后通过实例和自测,系统讲解相关知识点,同时兼顾实际开发项目经验。为了增强实用性,光盘中还特别赠送了精选的考试认证、求职面试等题库,供读者研究学习。最后,为帮助初入职场的从业者顺利进入角色,还在光盘中赠送了职业规划建议及相关开发文档。

图书摘要

版权信息

书名:C#从入门到精通(第2版)

ISBN:978-7-115-38357-0

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 策  划 龙马高新教育

  编  著 国家863中部软件孵化器

  责任编辑 张 翼

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


本书以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了C#的相关知识和实战技能。

本书第1篇【C#语言基础】主要讲解C#的基础知识、数据类型、变量与常量、运算符与表达式、程序的基本结构、异常处理与程序调试、常用数据类型的用法以及面向对象等;第2篇【Windows应用程序开发】主要讲解图形用户界面的基础知识、常用控件、界面设计与对话框、Windows编程高级应用以及报表与打印等;第3篇【核心应用技术】主要介绍集合与泛型、文件与注册表操作、ADO.NET数据库访问、配置文件与XML文件访问、图形图像处理、多线程编程、网络编程、类库与控件库、项目安装部署等;第4篇【项目实战】主要讲解项目规划,以及超市采购管理系统与典型管理系统的开发流程。

本书所附DVD光盘中包含了与图书内容全程同步的教学录像。此外,还赠送了大量相关学习资料,以便读者扩展学习。

本书适合任何想学习C#的读者,无论您是否从事计算机相关行业,是否接触过C#,均可通过学习快速掌握C#的开发方法和技巧。


“从入门到精通”系列是专为初学者量身打造的一套编程学习用书,由知名计算机图书策划机构“龙马高新教育”精心策划而成。

本书主要面向C#初学者和爱好者,旨在帮助读者掌握C#基础知识、了解开发技巧并积累一定的项目实战经验。当读者系统地学习完本书内容之后,就可以骄傲地宣布——“我是一名真正的C#程序员了!”。

荀子曰:不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。

实践对于学习的重要性由此可见一斑。纵观当前编程图书市场,理论知识与实践经验的脱节,是很多C#图书的写照。为了杜绝这一现象,本书立足于实战,从项目开发的实际需求入手,将理论知识与实际应用相结合。目标就是让初学者能够快速成长为初级程序员,并拥有一定的项目开发经验,从而在职场中拥有一个高起点。

本书总结了作者多年的教学实践经验,为读者设计了最佳的学习路线。

► 零基础、入门级的讲解

无论读者是否从事计算机相关行业,是否接触过C#,是否使用C#开发过项目,都能从本书中找到最佳起点。

► 超多、实用、专业的范例和项目

本书结合实际工作中的范例,逐一讲解C#的各种知识和技术。最后,还以实际开发项目来总结本书所学内容,帮助读者在实战中掌握知识,轻松拥有项目经验。

► 随时检测自己的学习成果

每章首页罗列了“本章要点”,以便读者明确学习方向。每章最后的“实战练习”则根据所在章的知识点精心设计而成,读者可以随时自我检测,巩固所学知识。

► 细致入微、贴心提示

本书在讲解过程中使用了“提示”、“注意”、 “技巧”等小栏目,帮助读者在学习过程中更清楚地理解基本概念、掌握相关操作,并轻松获取实战技巧。

► 17小时全程同步教学录像

涵盖本书所有知识点,详细讲解每个范例及项目的开发过程及关键点。帮助读者更轻松地掌握书中所有的C#程序设计知识。

► 超多王牌资源大放送

赠送大量王牌资源,包括38小时C#项目实战教学录像、799页C#类库查询手册、52页C#控件查询手册、10套超值完整源代码、56个C#常见面试题及解析电子书、123个C#常见错误及解决方案电子书、50个C#高效编程技巧、C#程序员职业规划、C#程序员面试技巧等。

01.光盘运行后首先播放片头动画,之后进入光盘的主界面。其中包括【课堂再现】、【C#项目实战教学录像】两个学习通道,和【范例源码】、【实战练习答案】、【赠送资源】、【帮助文件】、【退出光盘】五个功能按钮。

02.单击【课堂再现】按钮,进入多媒体同步教学录像界面。在左侧的章号按钮上单击鼠标左键,在弹出的快捷菜单上单击要播放的节名,即可开始播放相应的教学录像。

03.单击【C#项目实战教学录像】按钮,可以查看相关视频文件,在打开的文件夹中包含了教学录像及其实战源码,在【同步视频】文件夹下进入子文件夹,双击要播放的视频,即可使用电脑中的播放器进行播放。

04.单击【范例源码】按钮,可打开本书范例源码文件夹。

05.单击【实战练习答案】按钮,可在打开的文件夹中看到实战练习答案。

06.单击【赠送资源】按钮可以查看随本书赠送的资源。

07.单击【帮助文件】按钮,可以打开“光盘使用说明.pdf”文档,该说明文档详细介绍了光盘在电脑上的运行环境及运行方法等。

08.单击【退出光盘】按钮,即可退出本光盘系统。

更多学习资料,请访问www.51pcbook.cn

本书由龙马高新教育策划,国家863中部软件孵化器组织编写,邹东尧任主编,朱会东、王治国任副主编。参加编写的人员分工如下:第6~8章由张启坤编写,第9章和第10章由吴怀广编写,第11~15章由王治国编写,第16~20章由朱会东编写,第21~24章由黄燕编写,第0~5章及第25~27章由邹东尧、李晨编写。参加资料整理的人员有韩腾飞、薛枫、孔万里、李震、赵源源、乔娜、周奎奎、王果、陈小杰、左琨、邓艳丽、崔姝怡、侯蕾、左花苹、刘锦源、普宁、王常吉、师鸣若、钟宏伟、陈川、刘子威、徐永俊、朱涛和张允等。

在编写过程中,我们竭尽所能地将最准确的C#理解和感悟呈现给读者,但也难免有疏漏和不妥之处,敬请不吝指正。若您在学习过程中遇到困难或疑问,或有任何建议,可发送电子邮件至zhangyi@ptpress.com.cn。

 

编者


要想真正掌握C#,就必须知道这门语言的来源和历史。本章是学习C#语言的第0章,是读者掌握C#这门语言的启蒙课。通过对本章的学习,读者将初步了解C#语言的来源、C#的基础思想、C#的技术体系及C#应用领域和前景,除此之外,还可以通过C#学习经验之谈和C#学习路线图进一步了解C#。

本章要点(已掌握的在方框中打钩)

□ C# 的来源

□ C#的基本思想

□ C#的技术体系

□ C#应用领域和前景

□ C#学习经验谈

□ C#学习路线图

C#编程语言是微软公司推出的基于.NET框架的、面向对象的高级编程语言。C#与C、C++、Java有着密切的关系,是.NET框架中最常用的编程语言。

1995年,SUN公司推出面向对象的开发语言——Java之后,由于它的跨平台、跨语言特性,使得越来越多的基于C/C++的开发人员转向了Java。很快,微软公司也推出了基于Java语言的编译器Visual J++,并在短时间内升级到了6.0版本。

Visual J++虽然有强大的开发功能,但主要应用在Windows平台的系统开发中,因此SUN公司认为Visual J++违反了Java的许可协议,即违反了Java平台的中立性,这使得微软公司处于被动局面。为了改变这一局面,微软公司提出了进军互联网的庞大计划——.NET计划,以及该计划中的开发语言—C#。

1998年,Anders Hejlsberg 和他的微软开发团队开始设计C#语言(C#英文读做C Sharp)。

C#语言的发展主要经历了以下阶段。

2000年微软公司发布了C#语言的第一个版本,它是一种全新且简单、安全、完全面向对象的程序设计语言,是专门为.NET 的应用而开发的语言,它吸收了C++、Visual Basic、Delphi、Java等语言的优点, C#基本上继承了C语言的语法风格,又从C++那里继承了面向对象的特征。同时,C#和Java也极其相似。

2003年,微软公司发布了C# 1.2,Visual Studio.NET 2003使用的是C# 1.2。

2005年,微软公司发布了C# 2.0,Visual Studio.NET 2005使用的是C# 2.0。

2007年,微软公司发布了C# 3.0,Visual Studio.NET 2008使用的是C# 3.0。

2010年,微软公司发布了C# 4.0,Visual Studio.NET 2010使用的是C# 4.0。

2013年,微软公司发布了C# 4.5,Visual Studio.NET 2013使用的是C# 4.5。

C# 2.0在C# 1.2的基础上,增加了泛型、匿名方法、迭代、部分类等。C# 3.0在C# 2.0的基础上,增加了扩展方法、Lambda表达式、查询表达式、自动实现的属性、匿名变量等。C# 4.0在C# 3.0的基础上,增加了dynamic关键字、默认参数、可选参数等。C# 5.0在C# 4.0的基础上,增加了带参数的泛型构造函数、支持null类型运算、case支持表达式、扩展属性和绑定运算符等。

C#的基本思想即面向对象。面向对象的编程设计(Object Oriented Programming,OOP)旨在将实际世界中存在的事物或概念通过抽象的方法模拟到计算机程序中,尽量使用人的自然思维,着重强调人的正常思维方式和原则。

面向对象的编程设计是将数据及处理这些数据的操作都封装(Encapsulation)到一个称为类(Class)的数据结构中。面向对象的编程设计具有封装、继承和多态性等特点。封装用于隐藏调用者不需要了解的信息;继承则简化了类的设计;多态性是指相同对象收到相同信息,或不同对象收到相同信息时,产生不同的行为方式。

C#是一种全新的、面向对象的编程语言。它依附于.NET Framework架构,它高效的运行效率、简单易于理解的语法,加之强大的编译器支持,使得程序的开发变得异常迅速。它的技术体系主要有以下几个方面。

(1)彻底的面向对象设计,C#具有面向对象语言所拥有的一切特性,即封装、继承和多态。C#与Web应用紧密地结合,支持绝大多数的Web标准,例如,HTML、XML、SOAP等。

(2)Windows Form技术,用来开发Windows桌面程序,数据提供程序管理提供易于连接OLEDB和ODBC数据源 的数据控件,包括Microsoft SQL Server、Microsoft Access、Jet、DB2及Oracle等,通过强大的控件库可以快速开发出桌面应用程序。

(3)WPF技术,微软的新一代图形系统,运行在.NET Framework 3.0及以上版本,为用户界面、2D/3D图形、文档和媒体提供了新的操作方法。

(4)WebForm技术,是Windows使用C#语言来开发Web应用程序的工具,它封装了大量的服务器控件,让开发Web变得简单。

(5)MVC技术,是ASP.NET编程模式的一种,使用模型—视图—控制器设计创建Web应用程序,这种分层的设计使程序员能够在复杂性高的程序中各司其职,专注于自己的方面。

C#语言出身于微软公司,C#主要用来构建在.NET Framework上运行的各种安全、可靠的应用程序。它的应用领域十分广泛。

1.Web应用程序

Web应用包括ASP.NET应用程序、Windows窗体应用程序。

2.数据库应用程序开发

C#中的ADO.NET技术适合进行数据库应用程序的开发。数据库应用程序可理解为业务管理软件,具体应用如图书管理系统、人事管理系统等。

3.桌面应用程序

桌面应用包括控制台应用程序、Windows窗体应用程序等。

4.插件技术

插件技术编程在计算机软件中广泛运用,它提高了软件的扩展性,延长了软件的生命周期,在一定程度上是对软件功能的扩充。

5.移动设备应用程序

移动设备应用程序即嵌入式开发领域,主要是面向Windows CE等微软的产品。

6.游戏软件开发

C#语言通过与XNA游戏开发框架相结合,可以使开发出的游戏效果更加绚丽。

上面介绍了几个主要的C#应用领域,实际上C#语言几乎可以应用到程序开发的任何领域。那么C#的前景怎么样?根据2014年9月Tiobe编程语言排行榜可以看出,C#语言继续呈上升趋势,同比上升一位,排在了所有语言的第五位,发展趋势良好。下图所示为2014年9月Tiobe编程语言排行榜及C#语言发展趋势。

C#语言自C/C++演变而来,它的语法和Java语言一样,更加简洁。C#语言是完全按照面向对象的思想来设计的,且与Web应用和Windows应用紧密结合。那么怎样学习程序设计,学好C#语言?现将笔者的学习经验与读者朋友分享。

1.培养兴趣,明确学习目标

“兴趣是最好的老师。”如果把编写程序看做一种爱好,就不会觉得枯燥无味。在确定学习编程之前,需明确自己的学习目标,制定可行的计划,切忌三天打鱼两天晒网。

2.打好基础,循序渐进

“水之积也不厚,则其负大舟也无力。”在学习C#编程的路上要脚踏实地,一步一个脚印。先学好基础知识,再循序渐进地学习一些高级的特性。

3.多实践,多交流

“读十篇不如做一篇。”程序设计必须要自己动手动脑上机调试程序,切忌纸上谈兵。在初学编程时,一定会遇到许多问题。不要慌张,要多交流、多请教,吸取别人的长处,丰富自己的编程经验,提高编程水平。要注意培养自己的逻辑思维能力,掌握编程思想,当然,做到这一点,需要不断实践、思考、交流和总结。

4.善于利用资源

“泰山不让土壤,故能成其大;河海不择细流,故能就其深。”在学习C#的过程中,要充分利用网络资源,比如大型搜索引擎网站(百度、谷歌等)、知名的论坛、博客园等。多读好书,多参考程序代码,并从中分析,归纳出好的方法、经验为己所用。

5.养成良好的编程习惯

“习惯决定命运,细节决定成败。”良好的编程习惯对于编程能力的提高也是非常重要的。在编程时要有良好的风格,源代码的逻辑简明清晰、易读易懂是好程序的重要标准。

6.坚定目标,树立信心

“成功的奥秘在于目标的坚定。”在学习编程过程中,要坚持坚持再坚持!

第一步为入门阶段,主要学习C#基础语法,如数据类型、变量与常量、字符串与表达式、数组和集合、程序的基本结构、异常处理与程序调试、常用数据类型的用法,对C#面向对象编程有所认识的同时还要了解更高级的事件和委托。入门时,可编写一些控制台程序来巩固这些基础。

第二步为提高阶段,主要包括Windows应用程序高级控件、C#面向对象高级技术、ADO.NET数据访问技术、报表与打印、文件及数据流技术、线程的使用、网络编程技术,初步了解项目部署等。

第三步,有了第一步和第二步的基础,进行一些项目实战练习。在练习中查漏补缺,总结经验,从而掌握C#,并充分发挥C#的语言优势。


万丈高楼平地起,打好基础不费力!本篇是学习C#语言的基础,学好本篇可以为学习C#奠定根基。通过对本篇的学习,您将了解C#的基础知识、C#应用程序开发和运行平台.NET Framework、集成开发环境Visual Studio 2013、异常处理与程序调试,以及面向对象的重要特征和基本概念等内容。下面将带您步入C#的开发世界!

第1章 Hello C#——认识 C#

第2章 C#编程入门

第3章 数据类型

第4章 变量与常量

第5章 运算符与表达式

第6章 程序的基本结构

第7章 异常处理与程序调试

第8章 常用数据类型的用法

第9章 主流软件开发方法——面向对象

第10章 深入了解面向对象——面向对象的重要特征


本章视频教学录像:42分钟

要想练就真功夫,必须苦练基本功。本章是学习C#语言的第1章,是读者掌握C#这门语言的入门课。通过对本章的学习,读者将初步了解C#语言的发展和新特性、C#语法知识、C#应用程序的运行平台.NET Framework和开发工具Visual Studio 2013,以及如何使用帮助。

本章要点(已掌握的在方框中打钩)

□ .NET框架

□ C# 5.0简介

□ 集成开发环境Visual Studio 2013

本节视频教学录像:11分钟

C#是.NET平台(.NET Framework)上的编程语言,用C#编写的程序必须在.NET Framework上运行。学习C#,就必须理解.NET的运行机制,了解.NET框架。

.NET Framework(框架)简称.NET,是微软公司为开发应用程序创建的一个富有革命性的新平台。.NET 框架定义了.NET应用程序的开发和运行环境,包括可在.NET应用程序中使用的类库,它类似于Java的虚拟机。开发人员可以在此平台或环境下开发各种应用程序,就像火车必须在铁轨上才能行驶一样,用C#编写的程序必须在.NET Framework上运行,所以首先要在计算机中安装.NET Framework。

.NET Framework 是支持生成和运行下一代应用程序与XML Web Services 的内部 Windows 组件。.NET Framework 旨在实现下列目标。

(1)提供一个一致的面向对象的编程环境,无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行。

(2)提供一个将软件部署和版本控制冲突最小化的代码执行环境。

(3)提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。

(4)提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。

(5)提供一个开发不同类型的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)的一致方法。

(6)使用工业标准(XML)进行数据通信,确保基于 .NET Framework 的代码可与其他代码集成。

.NET Framework 有两个主要组件:公共语言运行库(CLR)和 .NET Framework 类库。公共语言运行库是 .NET Framework 的基础,它提供内存管理、线程管理和远程处理等核心服务,并强制实施严格的类型安全检查来提高安全性和可靠性。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码则称为非托管代码。.NET Framework 的另一个主要组件是类库,它是一个综合性的、面向对象的、可重用的类型集合,供开发者开发各种类型的应用程序。

.NET Framework 4.5在旧版本的基础上进行了很多方面的改进,并增加了很多新的技术和功能。下面简要介绍一下.NET Framework 4.5的部分新功能和改进。

1.工具

在 .NET Framework 4.5 中,利用资源文件生成器 (Resgen.exe),您可以从嵌入在 .NET Framework 程序集中的 .resources 文件中创建用于 Windows 应用商店应用的 .resw 文件。利用托管配置优化 (Mpgo.exe) 工具,可以通过优化本机映像程序集来改进应用程序的启动时间、内存使用率(工作集大小)和吞吐量。 该命令行工具会针对本机映像应用程序程序集生成配置文件数据。

2.并行计算

.NET Framework 4.5 提供了针对并行计算的多项新功能和改进功能, 其中包括改进的性能、增强的控件、对异步编程的增强支持、新的数据流库及对并行调试和性能分析的增强支持。

3.Web

ASP.NET 4.5 和ASP.NET 4.5.1 为 Web 窗体、WebSocket 支持、异步处理程序、性能增强和许多其他功能添加了模型绑定。

4.网络

.NET Framework 4.5 提供了一个用于 HTTP 应用程序的新的编程接口,还包含针对用于接受 WebSocket 连接并与之交互(通过使用现有 HttpListener 和相关类)的新编程接口的支持。此外,还新增和改进了对以下几方面的支持:与 RFC 兼容的 URI 支持、对国际域名 (IDN) 分析的支持、对电子邮件地址国际化 (EAI) 的支持、改进对 IPv6 的支持、双重模式套接字支持。

5.Windows Presentation Foundation (WPF)

在.NET Framework 4.5 中,WPF主要包含以下方面的更改和改进:利用新的 Ribbon 控件,可以实现承载快速访问工具栏、应用程序菜单和选项卡的功能区用户界面;支持同步和异步数据验证的新 INotifyDataErrorInfo 接口;针对静态属性的数据绑定、针对实现 ICustomTypeProvider 接口的自定义类型的数据绑定,以及从绑定表达式中检索数据绑定信息;在值发生更改时重新定位数据(实时数据整理);能够检查项目容器的数据上下文是否已断开连接;改进了对实现弱事件模式的支持,此外,事件现在可以接受标记扩展。

6. Windows Communication Foundation (WCF)

在.NET Framework 4.5 中已添加以下功能,以便更轻松地编写和维护WCF应用程序:简化生成的配置文件;对协定优先开发的支持;能够更轻松地配置 ASP.NET 兼容模式;对在代码中配置服务的支持;二进制文件编码器压缩支持;对使用国际域名的 WCF 服务的支持等。

7.Windows Workflow Foundation (WF)

在.NET Framework 4.5 中已将几项新功能添加到WF中,包括:首次作为 .NET Framework 4.0.1的一部分引入的状态机工作流;增强了工作流设计器功能;对 C# 表达式的支持;协定优先工作流服务开发,为自动生成活动以匹配现有服务协定提供支持等。

为了实现多语言开发,.NET所支持语言编写的代码先编译成微软中间语言(Microsoft Intermediate Language,MSIL)代码,再由即时编译器(JIT)转换成机器代码,这种编译方式实现了代码托管,提高了程序的运行效率。C#程序编译运行的简单步骤是:C#程序编译为中间语言代码;C#编译器生成程序集(*.exe或*.DLL文件);CLR执行程序集,生成本地代码。如下图所示。

本节视频教学录像:6分钟

本节介绍C#语言的发展历史以及C# 5.0的新特性等内容。

C#是一种强大的、面向对象的程序开发语言,是微软公司专门用于.NET 平台的编程语言,它用于快速地编写各种基于Microsoft .NET平台的应用程序。C#和Java都是C和C++家族中的成员,具有C和C++语言的特征。C#入门容易,不像C/C++那样难于学习。C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以更快地掌握C#。C#继承了C和C++语法的同时参考了Java的优点,是微软公司为了在Internet领域获取更多的利益并和Java相抗衡,重点推出的一种.NET平台的主流程序设计语言。

C#的发展历史如下。

1998年12月,微软公司提出.NET计划后,开始开发.NET平台上的面向对象程序的设计语言。

2000年2月,微软公司正式将这种语言命名为C#。

据说起名为C#,是因为开发小组的人很讨厌当时的搜索引擎,因此把大部分搜索引擎无法识别的“#”字符作为该语言名字的一部分;还有一种说法是因为音乐中“#”是升调记号,表达了微软公司希望C#在C的基础上更上一层楼的美好愿望。

2000年7月,微软公司发布了C#语言的第1个预览版。

2002年2月,微软公司发布了.NET开发平台Visual Studio.NET 2002和C#语言的第1个正式版本—— C# 1.0。

2003年4月,微软公司推出了Visual Studio .NET 2003,同时也发布了.NET Framework 1.1和C# 语言规范1.2(C# 1.2)。

2005年10月27日,Visual Studio .NET 2005、.NET Framework 2.0和C# 语言规范2.0 (C# 2.0)正式发布,在新的版本中提供了更多的类库和使用功能。

2007年8月20日,继.NET Framework 3.0发布后,C# 语言规范3.0(C# 3.0)发布。

2007年11月19日,微软公司发布了Visual Studio .NET 2008和.NET Framework 3.5。

2010年4月12日,微软发布了 Visual Studio 2010 及.NET Framework 4.0。

2012年9月12日,微软在西雅图发布了 Visual Studio 2012 ,其最大的新特性莫过于对Windows 8 Metro开发的支持。

2013年11月13日,微软发布了 Visual Studio 2013。

在当前的软件开发行业中,C#已经成为主流的程序设计语言,可以和Java语言平分天下。C#作为一种全新的编程语言,可以实现大多数程序员所需要的功能,包括开发Windows窗体应用程序、Windows服务程序、Web应用程序、Web服务程序、WPF应用程序、WPF浏览器应用程序等。

C# 5.0是对C# 4.0的改进,百分之百向后兼容,也就是说用C# 5.0开发的程序可以在C# 4.0环境下运行。C# 5.0增加了许多新特性,有5个有代表的新特性,如下所述。

(1)带参数的泛型构造函数。它的加入给一些设计增加了强大功能,泛型早在C# 2.0加入后就有着强大的应用,一般设计比较好的框架都会用到泛型,C# 5.0加入了带参数泛型构造函数,在原有基础上对C#泛型完善了很多。

(2)支持null类型运算。此功能特别是对有数据计算的这种null类型的支持,写代码方便了不少。虽然对于Nullable Types,在C# 2.0就加入进来了,但是不支持计算,例如,

01  Int x = null;
02  Int y = x + 40;

那么y值是多少?不支持计算得到的是null,但在C# 5.0以后,40加一个null的整数,我们得到的结果是40。

(3)case支持表达式。以前case里只能写一个具体的常量,而现在可以加表达式了,灵活多了。

(4)扩展属性。在C# 3.0里有扩展方法,C# 5.0里加入了扩展属性的概念,对照扩展方法,不难理解扩展属性的概念了。例如,

01  [Associate(string)]
02  public static int Zivsoft_ExtensionProperty { get;set;}

(5)异步处理。它如同C# 4.0加入dynamic概念一样,C# 5.0通过加入了async和await这两个关键字来简化异步编程。

C# 5.0的新特性为编程带来了更大的便利,有效地利用这些新特性可以编写出更加简洁的程序。

本节视频教学录像:25分钟

微软公司推出集成的开发环境Visual Studio.NET(简称VS)用于快速开发.NET应用程序。随着.NET平台的逐步升级,VS的版本也在不断提升,目前较新的版本是12.0 版本,即Visual Studio 2013(简称VS 2013),它在2013年11月13日23:00正式发布,它支持.NET框架4.5。Visual Studio 2013 可以用来创建高性能的Windows 应用程序、移动应用程序、网络应用程序、网络服务、智能设备应用程序和 Office 插件等。

VS 2013使得开发人员编写程序更容易、更灵活。它提供了高级开发工具、调试功能、数据库功能和创新功能,用于在各种平台上快速开发应用程序。 任何规模的组织都可以使用 VS 2013 快速创建更安全、更易于管理且更可靠的应用程序。

要想使用VS 2013,首先要在计算机上进行安装。如果有安装光盘,直接安装即可,也可以到微软公司的网站下载后安装(http://www.visualstudio.com/downloads/download-visual-studio-vs)。Visual Studio 2013安装文件所占的存储空间很大,大概有2.86GB,下载时间会比较长。下载下来的是光盘镜像ISO文件,需要安装虚拟光驱软件(如Daemon Tools等)。

技巧

VS 2013 安装要求:支持Windows 8.1(x86 和 x64)、Windows 8(x86 和 x64)、Windows 7 SP1(x86 和 x64)、Windows Server 2012 R2 (x64)等操作系统;

硬件最低要求:1.6 GHz 或更快的处理器、10 GB 可用硬盘空间、1 GB RAM(如果在虚拟机上运行,则为 1.5 GB)、5400 RPM 硬盘、与 DirectX 9 兼容的视频卡,其显示分辨率为 1024 x 768 或更高。

提示

建议配置:2.2 GHz 或速度更快的 CPU、2048 MB 或更大容量的 RAM、1280×1024 显示器、7200 RPM或更高转速的硬盘 ;

在 Windows 7 上安装硬件的最低要求为:2.4 GHz CPU、1024 MB RAM。

下面以专业版为例,介绍安装Visual Studio 2013的过程。

(1)将Visual Studio 2013安装盘放入光驱,将出现安装画面。

(2)勾选“我同意许可条款和隐私策略”选项,单击“下一步”按钮和“安装”按钮。

(3)等待安装完成,此过程可能会需要半小时。具体时间当然要根据你的电脑配置情况而定。

(4)安装成功后,单击“启动”按钮,出现登录界面,询问是否需要注册登录Visual Studio,不登录的话,选择“以后再说”进入下一步。

(5)选择开发环境,这里选择C#,颜色主题有三种选择,依自己喜好选择。

技巧

安装VS 2013时建议关闭杀毒软件,因为杀毒软件可能会阻止向计算机安装部分文件而导致安装失败。

Visual Studio 2013为开发人员提供了许多开发工具,可以显著地提高开发人员的工作效率。Visual Studio 2013集成开发环境 (IDE)由菜单栏、工具栏、编辑器,以及停靠或自动隐藏在左侧、右侧和底部的各种工具窗口组成。可用的工具窗口、菜单和工具栏根据所处理的项目或文件类型及随后执行的自定义配置,在IDE中的布局会有所不同。下面介绍Visual Studio 2013 IDE 的各个组成部分。

1.起始页

起始页上面有开始、最近、Visual Studio 2013新增功能和Microsoft平台新增功能介绍等选项。

在“开始”区域可以新建项目和打开已有的项目。“最近”区域包含了最近打开过的项目的链接。Visual Studio 2013和Microsoft平台新增功能选项的下面有相关的链接,单击链接就可以查看新增功能的介绍。产品视频和公告选项是微软为最新产品发布的视频介绍和微软有关Visual Studio最新动态的公告。

2.菜单栏

菜单栏和Office Word等程序的菜单栏类似,位于标题栏的下方,如下图所示。

Visual Studio 2013的菜单栏由【文件】、【编辑】、【视图】、【调试】、【团队】、【工具】、【测试】、【体系结构】、【分析】、【窗口】和【帮助】多个菜单组成,每个菜单都有一组命令,选择这些命令就可以完成相应的功能。

3.工具栏

菜单栏下方是工具栏,用户除了通过使用菜单栏进行操作外,一些常规的操作还可以通过工具栏进行,工具栏比菜单栏更方便、快捷。熟悉常用工具栏的使用能提高开发的效率。

提示

将鼠标指针移动到工具栏的按钮上停留一会儿,将显示出该按钮功能的提示。单击菜单栏上的【视图】菜单中的【工具栏】,将出现工具栏的级联菜单,单击所需的命令,此工具栏立刻就会出现在屏幕上,同时在其名称的前面会出现一个【√】。

4.工具箱

工具箱中列出了许多常用控件,用于设计程序的界面。所谓控件就是窗体中相对独立的部分,例如,常见的一些命令按钮、标签、文本框等都属于控件。Visual Studio 2013提供的控件分别放在【所有Windows窗体】、【公共控件】、【容器】、【菜单和工具栏】、【数据】、【组件】、【打印】、【对话框】、【WPF互操作性】、【报表】和【常规】选项卡里面。对这些选项卡也可以重命名或者删除,还可以添加选项卡。在任意一个选项卡中单击鼠标右键,将会弹出相应的快捷菜单,从中选择【全部显示】命令,会显示出所有的工具箱选项卡。需要注意的是,项目类型不一样,工具箱的选项卡显示也会有所不同。

5.解决方案资源管理器

项目是一个独立的编程单位,通常包括一个或几个程序文件,若干个相关项目组成一个解决方案。解决方案资源管理器(Solution Explorer)以树状结构显示整个解决方案中所包括的项目及每个项目的组成部分等信息。双击解决方案中的文件,就可以在编辑环境中显示这个文件并且可以编辑它。

解决方案资源管理器在系统中被保存为一个完整的文档,默认扩展名是.sln。一个解决方案可以包含多个项目,便于组织和管理项目,项目类型可以不同,如Windows应用项目、Web项目等。每个项目的文件扩展名是.csproj。双击.sln或.csproj文件都可以自动打开Visual Studio 2013,并打开解决方案及其中的项目。

6.属性窗口

属性窗口用来显示项目、窗体、控件、数据源等所有可视资源的属性,如控件的大小、颜色及位置等,在属性窗口底部有所选属性的简单说明。通过属性窗口能可视化地修改控件的属性,不必编写代码。属性窗口顶部是一个下拉列表,单击它可显示所用控件的名称。这个下拉列表称为“组件选择框”,它显示的名字就是当前控件的名称,列表里的内容就是当前控件的属性。

7.类视图

类视图按照树状结构列出了解决方案所包含项目中的每个类及类中包含的成员,以便于在大型项目中快速定位某个类。

8.设计视图和代码视图

设计视图(也称窗体窗口)是用来设计程序界面的场所,可以从工具箱中拖放一些控件到设计视图中,然后根据设计需要进行控件的布局。

代码视图(也称代码窗口、编辑窗口)是输入程序代码的窗口。可通过多种方法打开代码视图:双击设计视图中的控件或窗体;选择【视图】菜单中的【代码】命令;在【解决方案资源管理器】中双击扩展名为.cs的文件。

9.服务器资源管理器

服务器资源管理器用于开发人员对有权限操作的计算机上的资源进行访问和操作,可用来创建连接服务器对象,操纵服务器上的数据库。

10.动态帮助窗口

在编写程序的过程中,系统会根据当前的工作设置动态帮助窗口的内容。动态帮助窗口给编程提供了很大的方便,程序员不必在遇到问题时按【F1】键,只需要看一看动态帮助窗口,选择合适的链接并单击,就可以找到需要的内容。要使用动态帮助,需要安装MSDN,否则动态帮助为空。

本节视频教学录像:2分钟

Visual Studio 2013、.NET Framework 4.5、C#三者之间是怎样的关系?

C#是众多编程语言中的一种,也就是说它是众多基于.NET Framework的编程语言中的一种。

.NET Framework 4.5是Microsoft开发各种语言程序的平台,其中包含丰富的类库。C#、VB.net等编程语言编写的程序就是在这个平台上运行的。

Visual Studio 2013是很多种语言开发的集成开发环境,程序开发者都是在这个环境下编写C#、C++等程序代码的。

我们在安装Visual Studio的过程中会附带安装.NET Framework,在这个过程中还可以选择把C#、C++等开发语言都安装上。

思考题

1.使用Visual Studio能开发什么类型的项目?

2.C#语言有哪些优点?


本章视频教学录像:39分钟

通过第1章的学习,我们对C#语言和它的开发环境Visual Studio 2013有了一定的了解,在本章中我们将给大家介绍怎样编写第一个C#控制台应用程序、Windows 窗体应用程序及怎么使用MSDN和网络的帮助。

本章要点(已掌握的在方框中打钩)

□ 创建第1个控制台应用程序

□ 创建第1个Windows窗体应用程序

□ 学会使用MSDN和网络

本节视频教学录像:19分钟

通过前面的介绍,我们已经对Visual Studio 2013的强大功能有了初步的认识。本节利用Visual Studio 2013创建和编译第1个C#应用程序,带领大家进入C#编程世界。

【范例2-1】 使用Visual Studio 2013创建第1个控制台应用程序。

(1)单击【开始】【程序】【Microsoft Visual Studio 2013】【Microsoft Visual Studio 2013】命令,启动Visual Studio 2013。如果是第1次使用Visual Studio 2013,会提示用什么语言编写程序,选择C#即可。在Visual Studio 2013窗口中选择【新建】【项目】,在弹出的【新建项目】窗口中的【模板】中选择【Visual C#】,然后选择【控制台应用程序】,在【名称】文本框中输入项目名称“HelloCSharp”,并选择项目保存的【位置】(如D:\用户目录\documents\visual studio 2013\Projects)。

(2)单击【确定】按钮,直接打开“Program.cs”的代码窗口,并且会自动产生如下的代码。

01  using System;
02  using System.Collections.Generic;
03  using System.Linq;
04  using System.Text;
05  using System.Threading.Tasks;
06  namespace HelloCSharp
07  {
08         class Program
09         {
10                  static void Main(string[] args)
11                  {
12                  }
13         }
14  }

(3)在Program.cs 中的Main方法中输入以下代码(代码1-1.txt),如下图所示。

01  Console.WriteLine("Hello C# 4.5");
02  Console.ReadKey();

技巧

C#是一种对大小写特别敏感的编程语言,在拼写Main时,首字母必须大写。另外,程序中的Main函数必须为static类型。

(4)选择【生成】【生成解决方案】菜单命令,开始编译,如没有编译错误,输出窗口将显示生成成功的字样;如有错误,错误将在错误窗口中列出。

【代码详解】

Program.cs中的第1~5行代码是导入的命名空间,这是创建控制台应用程序时自动生成的,不用管它,最好不要动。第6行中namespace的后面是本项目命名空间,默认和项目名称一样。系统自动生成一个包含Main方法的Program类,自己想运行的代码一般都写在Main方法中。第12行代码是用户自己输入的,能在控制台输出“Hello C# 4.5”。第13行代码表示等待用户输入任意键。

【运行结果】

选择【调试】【启动调试】菜单命令或单击按钮,即可在控制台中输出结果,如下图所示。

提示

运行此程序时,这个控制台窗口会一闪而过。如果按【Ctrl+F5】组合键不调试直接运行,窗口就会停住。添加Console.ReadKey()或Console.Read()语句可以使运行暂停,按任意键继续,这样就能看清楚运行结果了。

【范例分析】

在这个程序中为什么会输出“Hello C# 4.5”呢?全靠步骤(3)中的Console.WriteLine方法。该方法是CLR库中“Console”类的输出方法之一,这个类就包含在命名空间System中,所以说系统自动生成的代码也是不可或缺的,如果去掉了“using System;”这行代码,就会提示当前上下文中不存在名称“Console”。另一方面,自动生成可以省去很多操作。

从这个程序中可以看出C#程序的以下几个典型特点。

(1)可以使用系统内的命名空间,如“using System;”,也可以自定义命名空间,如“namespace HelloWorld”。

(2)方法的定义,如第10行代码定义的是Main方法,程序是从这里开始执行的。

(3)类的声明,如“class Program”,声明以后就可以直接调用了。

在解决方案资源管理器中可以看到控制台应用程序的组成如下。

.AssemblyInfo.cs文件:存放程序集信息的文件。

.Program.cs文件:提供控制台应用程序运行入口的类文件,可以编写程序要执行的代码。

.引用:表示项目中用到的命名空间或组件,该项目中引用的都是系统自动提供的,也可以手动添加引用。

【拓展训练】

在控制台输出中文信息“你好,欢迎来到C# 4.5的世界!”。

既然能输出“Hello C# 4.5”,那么想输出“你好,欢迎来到C# 4.5的世界!”怎么办呢?只需要将步骤(3)的关键语句中的引号里面的内容改为你想要输出的内容即可(拓展代码1-1.txt)。

System.Console.WriteLine("你好,欢迎来到C#4.5的世界!");

提示

引号和括号需要使用英文形式的,Console前面的System.可以省略,因为使用了using System,否则不能省略。

运行后的输出如下图所示。

【范例2-2】 使用Visual Studio 2013创建第1个Windows应用程序。

(1)启动Visual Studio 2013,在Visual Studio 2013窗口中选择【新建】【项目】,弹出【新建项目】窗口,在【模板】中选择【Visual C#】,然后选择【Windows窗体应用程序】,在【名称】文本框中输入项目名称“HelloWindows”,然后单击【确定】按钮,打开一个带窗体的Windows应用程序。

(2)在【工具箱】窗口中可以把所需的控件添加到窗体上来进行界面设计(双击工具箱中的控件或直接把控件从工具箱拖放到窗体上),如分别添加一个文本框Textbox控件和一个按钮Button控件,如下图所示。

(3)在右下部分属性设置里面,设置按钮Button1的Text属性为“单击我”。

(4)双击窗体上的Button1按钮,自动打开代码视图窗口并生成button1_Click方法,然后添加代码如下(代码1-2.txt)。

textBox1.Text = "Hello,C# 4.5"; //设置textBox1的text属性

完整的代码如下。

01  using System;
02  using System.Collections.Generic;
03  using System.ComponentModel;
04  using System.Data;
05  using System.Drawing;
06  using System.Linq;
07  using System.Text;
08  using System.Windows.Forms;
09    
10  namespace HelloWindows
11  {
12     public partial class Form1 : Form
13     {
14           public Form1()
15        {
16                InitializeComponent();
17        }
18
19        private void button1_Click(object sender, EventArgs e)
20        {
21            textBox1.Text = "Hello,C# 4.5 "; //设置textBox1的text属性
22        }
23    }
24  }

【代码详解】

Windows窗体应用程序生成的窗体名默认为Form1.cs,Form1.cs中的1~8行是导入的命名空间,这是创建Windows窗体应用程序自动生成的。第10行中namespace的后面是本项目命名空间,默认和项目名称一样。第12行是Form1类的定义,第14~17行是自动生成的构造函数。第19~22行是单击按钮Button1时要执行的代码。第21行是自己输入的,用来在文本框中显示“Hello C# 4.5”信息。

【运行结果】

单击工具栏中的【启动调试】按钮,在出现的窗体中单击按钮,运行结果如下图所示。

【范例分析】

在这个Windows窗体应用程序中,代码比较简单。我们在窗体上添加TextBox和Button控件并设置其相应属性,编写按钮的单击事件处理程序方法代码“textBox1.Text = "Hello,C# 4.5";”;实现在文本框中输出信息。Windows窗体应用程序结构和控制台应用程序类似,除了有一个Form1.cs窗体文件外,也有一个Program.cs文件作为应用程序运行的主入口点。自动生成的代码如下。

01  using System;
02  using System.Collections.Generic;
03  using System.Linq;
04  using System.Windows.Forms;
05 
06  namespace HelloWindows
07  {
08    static class Program
09    {
10      /// <summary>
11      /// 应用程序的主入口点
12      /// </summary>
13      [STAThread]
14      static void Main()
15      {
16        Application.EnableVisualStyles();
17        Application.SetCompatibleTextRenderingDefault(false);
18        Application.Run(new Form1());
19      }
20    }
21  }

【拓展训练】 使用Visual Studio 2013创建第1个网站。

(1)启动Visual Studio 2013,选择【新建】【网站】,在弹出窗口中的【项目类型】中选择【Visual C#】,在【模板】中选择【ASP.NET Web窗体网站】,在【Web位置】后面输入网站名称“FirstWebSite”,【语言】选择“C#”,然后单击【确定】按钮,打开一个带Web窗体的网站项目。

(2)切换到自动生成的Default.aspx页面的设计视图,在Default.aspx页面上双击自动出现代码视图窗体,并生成Page_Load方法框架。在Page_Load方法中输入以下代码。

Response.Write("Hello C# 4.5"); //

完整代码如下。

01  using System;
02  using System.Configuration;
03  using System.Data;
04  using System.Linq;
05  using System.Web;
06  using System.Web.Security;
07  using System.Web.UI;
08  using System.Web.UI.HtmlControls;
09  using System.Web.UI.WebControls;
10  using System.Web.UI.WebControls.WebParts;
11  using System.Xml.Linq;
12 
13  public partial class _Default : System.Web.UI.Page
14  {
15    protected void Page_Load(object sender, EventArgs e)
16      {
17           Response.Write("Hello C# 4.5");//在页面上显示"Hello C#4.5"
18      }
19  }

Response.Write将信息输出到Web页面中,运行后的输出如下图所示。

本节视频教学录像:3分钟

在学习的过程中难免会遇到困难,如果遇到困难时,能解决问题的老师和朋友不在身边该怎么办?通过MSDN和互联网我们可以找到答案。

MSDN是开发人员必备的开发文档,安装Visual Studio 2013之后单击菜单栏中的【帮助】【添加和移除帮助内容】。在【添加和移除内容】中的搜索栏中输入Visual C#,搜索和Visual相关的帮助文档,然后在所搜索到的可用文档中单击【添加】,最后单击右下角的【更新】,等更新完成,相关内容就添加到了我们本地的电脑中。

MSDN的使用很简单,常用的使用方式有以下4种。

目录:以大纲的方式显示帮助信息,比如可以按照“Visual C#入门”主题学习C#。

索引:以关键字的方式显示帮助信息。

收藏夹:可以收藏某个主题的帮助文档。

除此之外,使用MSDN的搜索功能,可以按照关键字搜索帮助文档。假如用目录和索引方式没有找到需要的知识,还可以利用搜索功能来查找。可以同时搜索本地MSDN和网上社区,从而找到更多关于搜索关键字的文章。为了使搜索更准确,在搜索界面还可以设置需要搜索的编程语言和技术主题,从而缩小搜索的范围,以使搜索更精确。

网络是个巨大的知识库,也是很好的老师,一个初学者遇到的问题,别人也许早就遇到了,网络中一般会有相应的解决方法。一定要学会利用Google、Baidu等搜索引擎去搜索,到专业的网站或论坛上也能找到自己所需的资料,如CSDN网站等。

本节视频教学录像:7分钟

C#语言开发的一般过程和很多面向对象语言的开发过程一样,主要有以下5个步骤。

1.需求获取分析

相关系统分析员和用户初步了解需求,然后用Word列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面,在这一步里面可以初步定义好少量的界面。

系统分析员深入了解和分析需求,根据自己的经验和需求用Word或相关的工具再做出一份文档系统的功能需求文档。这次的文档会清楚列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且还列出相关的界面功能。

2.设计

软件设计可以分为概要设计和详细设计两个阶段。实际上软件设计的主要任务就是将软件分解成模块,即能实现某个功能的数据和程序说明、可执行程序的程序单元,可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可更换的功能单元。然后进行模块设计。概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。

3.编码

在软件编码阶段,开发者根据需求分析中对数据结构、算法分析和模块实现等方面的设计要求,开始具体的编写程序工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。

4.测试

软件测试的目的是以较小的代价发现尽可能多的错误。实现这个目标的关键在于设计一套出色的测试用例(测试数据和预期的输出结果组成了测试用例)。不同的测试方法有不同的测试用例设计方法。测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果。

5.软件交付

在软件测试证明软件达到要求后,软件开发者应向用户提交开发的目标安装程序、数据库的数据字典、用户安装手册、需求报告、设计报告、测试报告等。用户安装手册应详细介绍安装软件对运行环境的要求,安装软件的定义和内容,在客户端、服务器端及中间件的具体安装步骤,安装后的系统配置。

本节视频教学录像:10分钟

为了保证编写出的程序都符合相同的规范,保证一致性、统一性而创建的程序编码规范。编码规范对于程序员而言尤为重要,主要原因有以下几个。

(1)一个软件的生命周期中,80%的花费在于维护。

(2)几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。

(3)编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码。每个软件开发人员都必须遵守统一的编码规范。

(4)代码尽量简单直白。

1.说明

表达清晰的命名规范是程序规划的核心,如果规范的命名能清晰地表达出相应的功能,就可以让人“望文知意”,提高开发效率和系统的可维护性。反之,如果命名不能表达其含义,例如,“aaa”、“bbb ()”,那么将事倍功半。

2.Pascal风格

包含一到多个单词,每一个单词第一个字母大写,其余字母均小写。例如,HelloWorld、SetName等。

3.Camel风格

包含一到多个单词,第一个单词首字母小写,其余单词首字母大写。例如,name、productId等。

(1)除了参数与变量外,所有命名空间名称、类、函数、接口、属性等名称的命名,使用Pascal 风格。

(2)参数与变量的命名使用Camel风格。

约定的是如何选择最适当的名称,这些准则适用于所有标识符的命名。

1.选择名称

(1)请选择易读的英文名称。例如,英文 Order的意思为规则、次序、订购等,如果用在排序列中就不是很合适,用来表示订单则更具可读性。可读性比详细描述更重要,比如表示坐标名称的ScreenX就比ScreenHorizontally 更具可读性。

(2)除下画线外,不要使用连字符或任何其他非字母数字字符。在数据库表字段名称设计时,与其他表字段有关联时,适当地使用表名+下横线+字段名,可以更清晰地表现出该字段与关联表对应字段的关系。比如产品分类表ProductClass中有字段Id与Name,那么产品表绑定的这两个字段可命名为ProductClass_Id与ProductClass_Name,这样在查看产品表时就可以清晰地知道这两个字段与分类表的关系。

(3)避免使用与常用编程语言的关键字冲突的标识符。

(4)变量和方法参数使用Camel 风格。例如,

01  string productName="";
02  int number=0;
03  string sqlString="";
04  double averageScore=0.0;
05  Users users=newUsers();
06  Users model=newUsers();
07  Users userModel=newUsers();
08  const string const_String = "";
09    Private stringGetProductName(int id)
10  {
11    return"";
12  }

(5)不要使用成员属性作为成员变量的前缀(其他变量命名也一样)。例如, 不要像Users m_users;这样定义成员变量,可以使用第(4)点的设置。

2.字母缩写词

(1)通常不要使用缩写。

(2)除非这种缩写已被广泛接受,或者团队当中大家都认可一种缩写。例如,使用 OnButtonClick,如果团队中普遍认可OnBtnClick这种写法也是可以的。

命名空间的命名采用Pascal风格,取名的一般规则为Zhangsan. ProjectName (人名.项目名称),例如,Zhangsan.Office;需要用复数时,请使用复数,例如,使用System.Collections而不是System.Collection;需要缩写时,不需要加复数,例如,使用System.IO而不是System.IOs。

(1)按照Pascal大小写格式,使用名词或名词短语为类、接口和值类型命名。

(2)接口命名以字母I为前缀,例如,Icomponent。

(3)派生类的末尾使用基类名称。例如,从Stream继承的Framework类型以Stream结尾,从Exception继承的类型以Exception结尾。

按照Pascal大小写格式,使用名词或名词短语命名,并加上后缀Logic。

文件夹以功能模块名称,按照 Pascal大小写格式命名。比如后端管理功能及权限相关功能,全部放到Systems文件夹里。

(1)缩进和间隔。缩进用【Tab】键,不用【Spaces】键。

(2)注释需和代码对齐。多使用#regedit和#endregion代码块。

(3)在代码中垂直对齐左括号和右括号。

01  if (x == 0)
02  {
03  Response.Write(" ");
04  }

不要出现以下情况。

01  if(x == 0) {
02  Response.Write(" ");
03  }

或者:

if(x == 0){ Response.Write(" "); }

(4)适当地增加空行,来增加代码的可读性。

在下列情况下应该有两行空行。

① 同一文件的不同部分之间。

② 在类、接口及彼此之间。

在下列情况下应该有一行空行。

① 方法之间。

② 局部变量和它后边的语句之间。

③ 方法内的功能逻辑部分之间。

(5)避免使用大文件。如果一个文件里的代码超过300~400行,必须考虑将代码分开到不同类中。当然,模板生成类与逻辑层类除外。

(6)避免写太长的方法。一个典型的方法代码在1~25行之间。如果一个方法代码超过25行,应该考虑将其分解为不同的方法。

(7)为了防止在阅读代码时不得不滚动源代码编辑器,每行代码或注释在1024×768的显示频率下不得超过一显示屏。

(8)在大多数运算符之前和之后使用空格,这样做不会改变代码的意图,却可以使代码容易阅读。

例如,

int j = i + k;

而不应写为:

int j=i+k;

括号和它里面的字符之间不应该出现空格,括号应该和它前面的关键词留有空格。例如,

01  while (true)
02  {
03   
04  };

但是方法名和左括号之间不应该有空格,参数之间的逗号后应该加一个空格。例如,

method1(int i1, int i2)

for语句里的表达式之间加一个空格。例如,

for(expr1; expr2; expr3)

强制类型转换时,在类型和变量之间加一个空格。例如,

(int) i ;

(9)所有可供用户输入的字段值,必须忽略前后空白(不包含密码);在对字段值进行有效性验证时,对提交进数据库的内容必须进行SQL注入过滤与XSS过滤。

(10)一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小。

(11)避免使用很多成员变量,声明局部变量,并传递给方法。

(12)不要在方法间共享成员变量,如果在几个方法间共享一个成员变量,那就很难知道是哪个方法在什么时候修改了它的值。

(13)不在代码中使用具体的路径和驱动器名,使用相对路径,并使路径可编程。永远别设想你的代码是在“C:”盘运行。你不会知道,一些用户在网络或“Z:”盘运行程序。

(14)应用程序启动时进行“自检”并确保所需文件和附件在指定的位置。

如果需要的配置文件找不到,应用程序需自己创建使用默认值的一份。如果在配置文件中发现错误值,应用程序要抛出错误,给出提示消息告诉用户正确值。

(15)出现任何问题给用户一个友好的提示,错误消息需能帮助用户解决问题。

永远别用像“应用程序出错”、“发现一个错误”等之类的错误消息,而应给出像“更新数据库失败,请确保登录ID和密码正确” 的具体消息。显示错误消息时,除了说哪里错了,还应提示用户如何解决问题。不要用像“更新数据库失败”这样的,要提示用户怎么做,比如“更新数据库失败,请确保登录ID和密码正确”。

(16)错误处理和异常事件。

不要“捕捉了异常却什么也不做”。如果隐藏了一个异常,你将永远不知道异常到底发生了没有。

发生异常时,给用户提示友好的消息,但要精确记录错误的所有可能细节,包括发生的时间和相关方法、类名等。

别写太大的 try-catch 模块。如果需要,为每个执行的任务编写单独的 try-catch 模块。 这将很容易找出哪一段代码产生异常,并给用户发出特定的错误消息。

如果应用程序需要,可以编写自己的异常类。自定义异常不应从基类SystemException派生,而要继承于. IApplicationException。

本节视频教学录像:2分钟

什么是Windows窗体应用程序和控制台应用程序,各自有什么特点?

控制台程序是指类似DOS窗口那样,以console命令行方式运行的程序,操作系统都支持控制台程序,当然也包括Windows、Linux系统等。

控制台应用程序一般没有独立的窗口,输入和输出都是以标准I/O进行的,不像一般的客户端程序能使用鼠标操作。用户可以不用跟客户机进行交互,而且通常只运行在后台。

窗体是指程序与用户交互的可视界面,简单地说Windows窗体应用程序就是我们通常用到的各种客户端程序,可显示信息、请求用户输入及通过网络与远程服务器进行通信。有很好的人机交互界面,都是基于普通的C/S架构的程序。

两者的区别,简单一点地说就是,如果要对控制台应用程序进行操作,需要从命令行输入命令和参数,像DOS系统那样,Windows窗体应用程序就是拥有良好的人机交互界面,可显示信息、请求用户输入信息,使用起来简单方便。

操作题

用C#分别编写一个控制台应用程序、一个窗体应用程序和一个ASP.ent网站,实现输出“我爱C#程序设计语言!”的效果。


本章视频教学录像:53分钟

通过第2章的学习,我们对编写C#程序有了一个简单的了解。要想真正编出自己想要的程序,实现需要的功能,必须熟练掌握C#语法知识,这样在以后的练习中才能顺利进阶,达到高手水平。本章将介绍数据类型相关的内容。

本章要点(已掌握的在方框中打钩)

□ 值类型

□ 引用数据类型

□ 类型转换

□ 装箱和拆箱

本节视频教学录像:3分钟

数据类型就是指数据的种类。在应用程序中,要使数据能被计算机识别并处理,需要将数据分为不同的类型,这样做的好处是方便存储和计算。比如对姓名和地址的处理需要使用字符型,在对货币和数量的处理中又需要使用数值类型,这些数据都是不同类型的数据。如姓名“张三”为字符型,年龄“25”为整型等。

提示

为什么要定义数据类型?

因为计算机是没有思维的,你只有告诉它,它才知道这是什么。

比如你定义“int a”,计算机才知道a是一个整数,否则就因识别不出来它是什么而出错。

C#的数据类型分为值类型、引用类型和指针类型3大类。值类型包括简单类型、结构类型和枚举类型等。引用类型包括类类型、接口类型、委托类型和数组类型等。指针类型只能用于安全模式。下图展示了各种数据类型及其之间的关系。

值类型的数据存储在内存的堆栈中,可以提供快速访问。如果变量是值类型的,这个变量就包含实际数据,在一个独立的内存区域保存自己的值;如果在代码中修改其值,在内存中会保存修改后的值。C#中的大多数基本数据类型,如整型、字符型、浮点型、布尔型等都是值类型,结构、枚举也属于值类型。

引用类型是指向存储在内存堆中的数据的指针或引用。与纯粹的地址不同,引用总是指向一个对象,而且这个对象具有指定的类型,并且在堆上分配了存储空间。字符串、数组、接口、类等都属于引用类型。引用类型很抽象,就像是一个门牌号码,可以根据门牌号码找到办公室所在位置。值类型和引用类型的基本区别是内存中的存储方式。

所有的值类型均隐式地派生自System.ValueType,并且值类型不能派生出新的类。引用类型的变量又称为对象,可存储对实际数据的引用。常见的引用类型有class、interface、delegate、object和string等。多个引用变量可以附加于一个对象,而且某些引用可以不附加于任何对象,如果声明了一个引用类型的变量,却不将它赋给任何对象,那么它的默认值就是null。相比之下,值类型的值不能是null。

本节视频教学录像:23分钟

C#语言的值类型包括整数类型、浮点数类型、布尔类型、字符类型等简单类型及枚举类型和结构类型。本小节介绍简单类型,枚举类型和结构类型将在后面章节中介绍。

1.整数类型

整数类型的变量值为整数。计算机语言提供的整数类型的值总是在一定的范围之内。根据数据在计算机内存中所占的位数来划分,C#有8种整数类型的数据,这些数据及其在计算机中表示的整数的范围如下表所示。

数据类型

含义

取值范围

sbyte

有符号8位整数

-128~127(-27~27-1)

byte

无符号8位整数

0~255(0~28-1)

short

有符号16位整数

-32768~32767(-215~215-1)

ushort

无符号16位整数

0~65535(0~216-1)

int

有符号32位整数

-2147483648~2147483647(-231~231-1)

uint

无符号32位整数

0~4294967295(0~232-1)

long

有符号64位整数

-9223372036854775808~9223372036854775807 (-263~263-1)

ulong

无符号64位整数

0~18446744073709551615(0~264-1)

例如,定义整型变量如下。

01  int s;   //定义int类型的变量s
02  s=50;    //将50的值赋给s

上述两行代码也可合并为:

int s=50;   //定义int类型的变量s,将50的值赋给s

如果是同类型的多个变量,也可将其声明语句简写入同一行代码中,例如,

int a = 10, b = 20,c;    //c还未被赋值

对于一个整数没有进行任何明确的声明,则该变量默认为int类型,一般情况下,应根据程序的需要选择合适的数据类型。为了把键入的值指定为其他的数据类型,可以在数字后面加上如下字符。

01  uint ui = 20  U;      //uint类型可以在数字后加上字符U
02  long l = 20  L ;      //long类型可以在数字后加上字符L
03  ulong ul = 20  UL;   //ulong类型可以在数字后加上字符UL

提示

这些大写字符也可以用相应的小写字符代替,但字符“l”易与整数“1”混淆,所以推荐使用大写字符。

【范例3-1】 创建一个控制台程序,声明一个int类型的变量x并初始化为1000,一个byte类型的变量y并初始化为245,最后输出。

(1)在Visual Studio 2013中新建C#控制台程序,项目名为“Text”。

(2)在Program.cs的Main 方法中输入以下代码(代码3-1.txt)。

01  int x = 1000;                            //声明一个int类型的变量x并初始化值        
02  byte y = 245;                            //声明一个int类型的变量y并初始化值
03  Console.WriteLine("x={0}", x);           //在控制台输出x结果
04  Console.WriteLine("y={0}", y);           //在控制台输出y结果
05  Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

此时,如果将byte类型的变量y赋值为260,重新编译程序,则会出现错误。主要原因是byte类型的变量是8位无符号整数,它的范围是0~255,260超过了byte类型的范围,因此编译程序时会出现错误。

2.浮点数类型

浮点数类型又称为实数类型,是指带有小数部分的数值。C#支持两种浮点数类型:单精度(float)和双精度(double)。它们的差别在于取值范围和精度不同。浮点数类型数据的特征如下表所示。

数据类型

含义

取值范围

有效数字位数

float

32位浮点数

±1.5×10-45~3.4×1038

7

double

64位浮点数

±5.0×10-324~1.7×10308

15~16

若对于浮点数没有进行任何明确的声明,则该变量默认为double类型。如果想强制将其指定为float类型,则在其后面加上字符“F”或者“f”。

float f = 10.5  F;   //float类型在数字后加上字符F

如果想将数值强制指定为double类型,则在其后面加上字符“D”或者“d”。

double d= 112  D;   //double类型在数字后加上字符D

技巧

浮点数有一定的取值范围和有效数字限制,超出规定范围的数据是无法表示的。float类型精度为7位有效数字,因此float的值经常会有些误差。例如,10减去9.90得到的结果不是0.10,而是一个接近0.099999999的值。

3.字符类型

除了数字外,计算机处理的信息主要是字符。C#字符类型采用Unicode字符集,一个Unicode标准字符长度为16位,允许用单个编码方案表示世界上所有的字符。计算机中对字符型数据的存储并不是把该字符本身放到内存单元中去,而是将该字符相应的Unicode代码放到存储单元中,即一个字符占两个字节的存储单元,存储单元存放的是该字符相应的Unicode码值。

在C#中,字符常量是用单引号(即撇号)括起来的一个字符,如'a'、'x'、'D'、'?'、'$'等都是字符常量。将字符放在双引号中,编译器会把它看做字符串,从而产生错误。注意,'a'和'A'是不同的字符常量。如下所示。

  char  c1= 'X';    //将字符X赋给字符型变量c1

除了以上形式的字符常量外,C#还允许使用一种特殊形式的字符常量,即以“\”开头的字符序列。它们一般用来实现一定的控制功能,并没有一定的字型,这种非显示字符难以用一般形式的字符表示,故规定用这种特殊的形式来表示,这种形式的字符也称为“转义字符”。在C#中,转义字符及其含义如下表所示。

转义符

含义

转义符

含义

\'

单引号

\e

取消(Esc)

\''

双引号

\f

换页

\\

反斜杠

\n

换行

\0

空字符

\r

回车

\a

感叹号(Alert)

\t

水平制表符

\b

退格(Backspace)

\v

垂直制表符

转义字符的使用如下所示。

  char  c2  = "\";       // c2表示单引号
  char  c3  = "\0";      // c3表示空字符

C#中用string类型表示字符串,所以不需要使用char数组表示字符串。

4.decimal类型

为了适应高精度的财务和货币计算的需要,C#提供了十进制decimal类型。decimal类型数据的特征如下表所示。

数据类型

含义

取值范围

有效数字位数

decimal

128位高精度十进制数表示法

±1.0×10-28~±7.9×1028

7

要把数字指定为decimal类型,而不是double、float或者整型,可以在数字后面加上字符“M”或者“m”,例如,

  decimal d = 2.718 M;   //定义decimal类型的变量d,将2.718的值赋给d

提示

如果计算的结果对精度要求非常高,如财务金融计算,就应该使用decimal类型,而不是浮点数类型。这是因为decimal类型有比浮点数类型数据较高的精度和较小的值域,decimal类型不受舍入错误的影响。

【范例3-2】 已知圆的半径为12cm,编程计算圆的面积。

(1)在Visual Studio 2013中新建C#控制台程序,项目名为“Circle”。

(2)在Program.cs的Main 方法中输入以下代码(代码3-2.txt)。

01  decimal pi = 3.14159M;   //字母M表示数据是decimal类型
02  int r = 12;              //定义int型变量r 表示圆的半径
03  decimal  s = 0;          //用来存放圆的面积
04  s = pi * r * r;          //计算圆的面积
05  Console.WriteLine("圆的半径是{0},\n圆的面积是:{1}",r, s);   //在控制台输出结果
06  Console.ReadKey();       //暂停运行,按任意键继续
07  Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

【范例分析】

在这个实例中定义了decimal类型的变量pi和s来代表圆周率和圆的面积,int型的变量r表示圆的半径。第1行代码中数据的后面加M表示数据是Decimal类型;第4行是计算圆的面积;第5行是在控制台输出结果,“\n”是转义字符,起换行作用,{0}和{1}中的0和1是占位符号,分别将r和s的结果显示在{0}和{1}所在的位置;第6行是暂停程序的运行,以便能看清运行的结果。

【拓展训练】

把【范例3-2】的输出结果以消息框的形式显示(拓展代码3-2.txt)。

(1)在【范例3-2】中添加对“System.Windows.Forms”的引用。在【解决方案资源管理器】中的【引用】上单击鼠标右键,单击弹出的【添加引用】项,在出现的【添加引用】窗口中选择【.NET】选项卡,找到“System.Windows.Forms”,然后单击【确定】按钮即可。

(2)在Program.cs中添加如下的导入命名空间语句。

using System.Windows.Forms;   //使用创建基于 Windows 的应用程序的类

(3)将【范例3-2】步骤(2)中的第5行语句改为使用MessageBox.Show输出运行结果。

MessageBox.Show ("圆的半径是:"+r+"\n圆的面积是:"+s);   //以消息框输出圆的面积

【运行结果】

运行结果如下图所示。

MessageBox.Show能以消息框的形式显示结果,要求以字符串形式表示输出的结果。“\n”是转义字符,起换行作用。

5.布尔类型

布尔类型(bool)是一种用来表示“真”或“假”的逻辑数据类型,布尔类型占用一个字节的内存。在C#中,布尔类型变量只有两种取值:true(代表“真”)和false(代表“假”)。并且true值不能被其他任何非0值所代替。如下所示。

01  bool flag=true;   //正确
02  bool flag=1;      //错误,不能将一个整型数据赋给布尔类型的变量

本节视频教学录像:2分钟

C#中的值类型比较简单,但对更加复杂的数据处理效率很低。C#的引用类型主要用来描述结构复杂、抽象能力比较强的数据,它与值类型数据是相并列的。同为引用类型的两个变量,可以指向同一个对象,也可以针对同一个变量产生作用,或者被其他同为引用类型的变量所影响。字符串、类、接口、委托和数组等均属于引用类型。下面介绍字符串类型。

字符串是一种引用类型,是由放在一对双引号中的多个字符组成的一个串,可以将其看做一个由字符组成的数组。通常使用string来声明字符串变量,例如,

string  name="Tom"   //定义一个值为Tom的字符串变量name

关于字符串的详细操作,将在8.1节详细介绍。

本节视频教学录像:20分钟

在输出结果时经常要把整型、浮点型等类型转换为字符串。不同类型的数据需要转换为同一类型才能正常计算,所有的操作过程中经常会涉及数据类型之间的转换。C#中数据类型的转换可以分为两类:隐式转换和显式转换。

隐式转换就是系统默认的、不需要加以声明就可以进行的转换。在该过程中,编译器不需要对转换进行详细检查,就能安全地进行转换。例如,

01  short st=250;
02  int  i=st;           //将短整型隐式转换成整型

在C#引入var类型的变量之前,隐式转换仅存在于数值类型的数据之间。引入var类型之后,用var定义的变量可以实现隐式数据转换。

1.数值类型数据间的隐式转换

隐式数据类型转换适用于数值类型的数据之间,如整型数据(int)可以隐式转换为浮点型(float)和双精度型(double)数据,浮点型(float)可以隐式转换为双精度型(double)数据。隐式数据类型转换只有遵循如下表所示的规则才能实现。

类型

可转换为的类型

sbyte

short、int、long、float、double 或 decimal

byte

short、ushort、int、uint、long、ulong、float、double 或 decimal

short

int、long、float、double 或 decimal

ushort

int、uint、long、ulong、float、double 或 decimal

int

long、float、double 或 decimal

uint

long、ulong、float、double 或 decimal

long

float、double 或 decimal

char

ushort、int、uint、long、ulong、float、double 或 decimal

float

double

ulong

float、double 或 decimal

从int、uint、long或ulong到float,以及从long或ulong到double的转换可能导致精度损失,但不会影响数量级。其他的隐式转换不会丢失任何信息。

2.var类型数据隐式转换

用var定义的变量的数据类型是由赋值的数据决定的。如var Name="Johnson",此时变量Name就是字符串类型进行了隐式转换。如下所示。

01  var intNum=250;
02  int i=intNum;          //var型变量intNum隐式转换成整型
03  var Name="Johnson";
04  string strName=Name;   //var型变量Name隐式转换成string型

显式转换又叫做强制类型转换,需要用户明确地指定转换的类型。通过显式数据转换,可以把取值范围大的数据转换为取值范围小的数据。显式转换可以发生在表达式的计算过程中,但可能引起信息的丢失。例如,下面的代码把float类型的变量pi强制转换为int,小数部分的信息就丢失了。

01  float pi=3.14f;   //定义一个单精度的实数
02  int i=(int)pi;    //将单精度强制转换为整型来计算,i的值是3,不是3.14,造成信息丢失

.Net Framework提供了很多类库,其中System.Convert类就是专门进行类型转换的类,通过Convert类提供的方法可以实现各种基本数据类型间的转换。Convert类的常用方法如下表所示。

方法

说明

ToBoolean

将指定的值转换为等效的布尔值

ToChar

将指定的值转换为 Unicode 字符

ToDateTime

将指定的值转换为 DateTime

ToDecimal

将指定值转换为 Decimal 数字

ToDouble

将指定的值转换为双精度浮点数

ToInt16

将指定的值转换为 16 位有符号整数

ToInt32

将指定的值转换为 32 位有符号整数

ToString

将指定值转换为其等效的 String 表示形式

例如,

01  String MyString="true";
02  Bool MyBool=Convert.ToBoolean(MyString);     //将String转换为Boolean型,MyBool=true
03  String newString="123456789";
04  Int MyInt=Convert.ToInt32(newString);        //将字符串转换为数字值,MyInt=123456789

【范例3-3】 隐式转换、显式转换使用举例。

(1)在Visual Studio 2013中新建C#控制台程序,项目名为“TypeConvert”。

(2)在Program.cs的Main 方法中输入以下代码(代码3-3.txt)。

01  Console.WriteLine("隐式、显式转换例子:");
02  short r = 25;        //表示圆的半径
03  int i = r;           //将短整型r隐式转换成整型 
04  float pi=3.14f;      //定义一个单精度的实数
05  double s1=pi*i*i;    //s1为double型,表示圆的面积
06  int s2;
07  s2  = (int)pi * i * i;      //s2为int型,表示圆的面积
08  var Name="Johnson";
09  string strName = Name;     //var型变量Name隐式转换为string型
10  Console.WriteLine("r=25,圆的面积={0},{1}", s1, s2);
11  Console.WriteLine("转换成功!");
12  Console.ReadLine();

【代码详解】

第3行表示将short类型隐式转换为int;第5行表示将int和float类型隐式转换为double类型;第7行表示显式把float转换为int;第8~9行表示var类型隐式转换为string类型。

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

技巧

第7行代码如果写成s2=pi*i*i,隐式转换将失败,因为float不能隐式转换为int类型。

【范例分析】

这个范例主要演示了类型的转换。从运行结果看,强制转换存在信息丢失的现象,如第7行将pi强制转换为int,原来是3.14,转换后变成了3。隐式类型转换要遵循前面给出的规则,否则转换就会失败。

【拓展训练】

扩展【范例3-3】,使用Convert类的方法来实现类型的转换。代码如下(拓展代码3-3.txt)。

01  Console.WriteLine("隐式、显式转换例子:");
02  short r = 25;                   //r表示圆的半径
03  int i = Convert.ToInt32( r);    //将短整型r隐式转换成整型 
04  float pi = 3.14f;               //定义一个单精度的实数
05  double s1  = pi * i * i;        //s1为double型,表示圆的面积
06  int s2;
07  s2  =  Convert.ToInt32(pi) * i * i;                //s2为int型,表示圆的面积
08  var memberName = "Johnson";
09  string  strName =  Convert.ToString (memberName);  //var型变量隐式转换为string型
10  Console.WriteLine("r=25,圆的面积={0},{1}", s1, s2);
11  Console.WriteLine("memberName={0}",memberName);
12  Console.WriteLine("转换成功!");
13  Console.ReadLine();

【运行结果】

运行结果如下图所示。

在C#中字符串和数值经常需要互相转换,下面介绍二者之间的转换方法。

ToString()方法:数值类型的ToString()方法可以将数值型数据转换为字符串。

Parse()方法:数值类型的Parse()方法可以将字符串转换为数值型,例如,字符串转换为整型使用int.Parse(string),字符串转换为双精度浮点型使用double.Parse(string)等。

例如,

01  int num1  = 25;
02  string str1  = num1.ToString();     //num1的ToString()方法将num1转换为string赋给str1
03  string str2  = "38";
04  int num2  = int.Parse(str2);        //int.Parse()方法将字符串str2转换为int类型
05  string str3  = "21";
06  double num3  = double.Parse(str3);  // double.Parse()将字符串转换为双精度浮点型
07  string str4  = "56";
08  float num4  = float.Parse(str4);   //float.Parse()将字符串转换为单精度浮点型

拆箱是把“引用”类型转换成“值”类型,装箱是把“值”类型转换成“引用”类型,这是数据类型转换的一种特殊应用。有时某些方法的参数要求使用“引用”类型,而想把“值”类型的变量通过这个参数传入,就需要使用这个操作。例如,

01  int n=4;        //n是值类型
02  object obj=n;   //封箱,把任何值类型隐式地转换为object类型 ,其中object为引用类型
03  Console.WriteLine("n的初始值为:{0},装箱后的值为{1}",n,obj.ToString());
04  int m=(int)obj;   //拆箱,把一个object类型隐式地转换为值类型
05  Console.WriteLine("引用类型的值为:{0},拆箱后的值为{1}",obj.ToString(),m)

本节视频教学录像:4分钟

引用类型和值类型变量的使用是C#中的高级技巧之一。值类型变量中保存的是自己的实际数据,在赋值的时候会把源变量的数据复制一份,然后赋给目的变量;引用类型变量中保存的是“指向实际数据的指针”,即实际对象数据的内存地址,在进行赋值操作的时候,它和值类型一样,也是先有一个复制的操作,不过它复制的不是实际的数据,而是引用(真实数据的内存地址)。

1.怎么区分值类型与引用类型

以struct关键字定义的数据类型就是值类型,另外,枚举类型也是值类型;以class关键字定义的数据类型就是引用类型。

2.值类型变量与引用类型变量的使用区别

值类型变量不需要使用new关键字来分配内存。相信大家使用int型变量时,就没有使用new来为其分配内存,定义完之后,就可以直接使用;引用类型变量则需要为其赋值后,才能使用。下面举例说明值类型与引用类型在使用上的区别。

首先定义两种类型的员工:结构体SEmployee和类CEmployee。

01  struct SEmployee
02  {
03           public int Age; 
04  }
05  class CEmployee
06  {
07           public int Age;
08  }

在main函数中,按照如下编写:

01  {
02    SEmployee se;
03    se.Age = 4;
04    Console.WriteLine("年龄:{0}", se.Age);
05    Console.ReadKey();
06  }

程序编译没有任何问题,运行后输出【年龄:4】。现在按照如下的代码编写main函数:

01  {
02    CEmployee ce;
03    ce = new CEmployee();
04    ce.Age = 5;
05    Console.WriteLine("年龄:{0}", ce.Age);
06    Console.ReadKey();
07  }

这时程序就不能通过编译,提示使用了未赋值的变量“ce”,把注释掉的那一行恢复就可以顺利通过编译,运行后输出【年龄:5】 。

通过这个小例子可以看出,值类型变量在定义后,就直接可以使用,而引用类型必须使用new关键字后才能使用。对于引用类型会有“未将对象引用设置到对象的实例”错误,而值类型不会发生这种错误。

3.值类型与引用类型的内存分配区别

内存分配时间:值类型变量在定义后就完成内存分配,引用类型必须显式用new关键字来分配内存。

内存分配区域:值类型的实例一般在线程栈上分配(也可以作为字段嵌入引用类型的对象中),在代表值类型的变量中,并不包含一个指向实例的指针,变量已经包含了实例本身的字段;引用类型总是从托管堆分配的,C#的new操作符会返回对象的内存地址,也就是指向对象数据的内存地址。

4.值类型与引用类型的优缺点

值类型变量在定义后,不论使用与否都会进行内存分配,因此当定义值类型而又没有使用的情况下,这些无用的变量就白白占用了内存。

值类型是按值传递的,也就是当用一个变量给另外一个变量赋值时,会把源变量的值赋值一遍,传给目的变量,当值类型(结构体)定义的比较大时,值类型的传递效率就非常低。

每个值类型的变量都有自己的内存空间,很难做到几个值类型的变量共享一个内存空间。

引用类型变量在定义后,不会自动分配内存,因此我们可以在用到引用类型变量的时候,用new来分配空间,不会造成内存的浪费;但是,引用类型是在托管堆上分配的,也就是其内存回收通过垃圾回收器来回收,引用类型的使用会增加应用程序在其生存期内需要进行的垃圾回收次数。

引用类型是按引用传递的,也就是内存地址在引用类型变量之间传递,这种传递方式效率非常高,当对象非常大时,可以优先考虑引用类型。

每个引用变量存储的是内存地址,可以实现多个变量共享一个内存空间。

当数据传递后,要求对目的变量的修改不能影响源变量的值,可以考虑将数据类型设计为值类型;当数据可以传递后,要求其后的操作必须影响到源数据,可以考虑将数据类型设计为引用类型。值类型与引用类型各有优缺点,使用时应根据实际的需要,选择合适的类型。

操作题

创建一个控制台应用程序,声明一个整型变量x并赋值为100,然后将其复制到装箱对象obj中。最后进行拆箱操作,将装箱对象obj赋值给整型变量y。


相关图书

程序员的制胜技
程序员的制胜技
C#开发案例精粹
C#开发案例精粹
C#完全自学教程
C#完全自学教程
 C#初学者指南
C#初学者指南
C#本质论(第4版)
C#本质论(第4版)
C# 5.0入门经典
C# 5.0入门经典

相关文章

相关课程