c#c 高级编程第10版 pdf考试求助

《C#高级编程(第9版)》 在线阅读 TXT和PDF高清完整电子版可下载
版 次:5页 数:字 数:印刷时间:日开 本:12k纸 张:胶版纸印 次:1包 装:平装是否套装:否国际标准书号ISBN:3
高清电子书下载请联系微信:yefei147852
高清电子书下载请联系微信:yefei147852
丛书名:.NET 开发经典名著
累计畅销16年,wrox精品红皮书,引领无数程序员进入程序开发殿堂
2009年度/2011年度全行业优秀畅销书,深受广大读者喜爱
2008年度优秀技术图书!
2007年度*畅销的C#销售图书!
2006年*受读者喜爱的十大技术开发类图书!
2005年*权威的十大IT图书之C#2010**版!
本书由.NET专家的梦幻组合编写,包含开发人员使用C#所需的所有内容。C#是编写.NET应用程序的一种语言,本书适合于希望提高编程技巧的、有经验的C#程序员,也适用于刚开始使用C#的专业开发人员。本书探讨了Visual Studio 2013和.NET Framework4.5.1、新的测试驱动开发和并发编程功能。所有示例的源代码都可以下载,读者可以立即开始编写Windows桌面应用程序、Windows Store应用程序和ASP.NET Web应用程序。作者简介
Christian Nagel是Microsoft RD、Microsoft MVP、thinktecture的合作伙伴、CN革新技术的奠基人,他还是一位软件架构师和开发人员,为开发Microsoft .NET解决方案提供培训和咨询服务。他具备超过25年的软件开发经验。Christian从PDP 11和VAX/VMS系统开始其计算机生涯,熟悉各种语言和平台。他具备Microsoft技术的深厚功底,编写了大量图书,并获得了Microsoft认证培训师和专业开发人员证书。
Jay Glynn开发软件的时间超过20年,使用PICK Basic为PICK操作系统编写应用程序。到目前为止,他使用过Delphi、VBA、Visual Basic、C、Java和C#编写软件。他目前是VGT的高级软件工程师,编写基于Web的应用程序。
Morgan Skinner是一位自由顾问,他在开始自己的顾问生涯之前,在Microsoft工作了将近10年。
第Ⅰ部分C#语言
第1章.NET体系结构
1.1C#与.NET的关系
1.2公共语言运行库
1.2.1平台无关性
1.2.2提高性能
1.2.3语言的互操作性
1.3中间语言
1.3.1面向对象和接口的支持
1.3.2不同的值类型和引用类型
1.3.3强数据类型化
1.3.4通过异常处理错误
1.3.5特性的使用
1.4.1私有程序集
1.4.2共享程序集
1.4.4并行编程
1.4.5异步编程
1.5.NETFramework类
1.6名称空间
1.7用C#创建.NET应用程序
1.7.1创建ASP.NET应用程序
1.7.2使用WPF
1.7.3WindowsStore应用程序
1.7.4Windows服务
1.7.6WindowsWF
1.8C#在.NET企业体系结构中的作用
第2章核心C#
2.2第一个C#程序
2.2.2编译并运行程序
2.2.3详细介绍
2.3.1变量的初始化
2.3.2类型推断
2.3.3变量的作用域
2.4预定义数据类型
2.4.1值类型和引用类型
2.4.2CTS类型
2.4.3预定义的值类型
2.4.4预定义的引用类型
2.5.1条件语句
2.5.3跳转语句
2.7名称空间
2.7.1using语句
2.7.2名称空间的别名
2.8Main()方法
2.8.1多个Main()方法
2.8.2给Main()方法传递参数
2.9有关编译C#文件的更多内容
2.10控制台I/O
2.11使用注释
2.11.1源文件中的内部注释
2.11.2XML文档
2.12C#预处理器指令
2.12.1#define和#undef
2.12.2#if、#elif、#else和#endif
2.12.3#warning和#error
2.12.4#region和#endregion
2.12.5#line
2.12.6#pragma
2.13C#编程规则
2.13.1关于标识符的规则
2.13.2用法约定
第3章对象和类型
3.1创建及使用类
3.2类和结构
3.3.1数据成员
3.3.2函数成员
3.3.3只读字段
3.4匿名类型
3.5.1结构是值类型
3.5.2结构和继承
3.5.3结构的构造函数
3.9Object类
3.9.1System.Object()方法
3.9.2ToString()方法
3.10扩展方法
4.2继承的类型
4.2.1实现继承和接口继承
4.2.2多重继承
4.2.3结构和类
4.3实现继承
4.3.1虚方法
4.3.2隐藏方法
4.3.3调用函数的基类版本
4.3.4抽象类和抽象函数
4.3.5密封类和密封方法
4.3.6派生类的构造函数
4.4.1可见性修饰符
4.4.2其他修饰符
4.5.1定义和实现接口
4.5.2派生的接口
5.1泛型概述
5.1.2类型安全
5.1.3二进制代码的重用
5.1.4代码的扩展
5.1.5命名约定
5.2创建泛型类
5.3泛型类的功能
5.3.1默认值
5.3.4静态成员
5.4泛型接口
5.4.1协变和抗变
5.4.2泛型接口的协变
5.4.3泛型接口的抗变
5.5泛型结构
5.6泛型方法
5.6.1泛型方法示例
5.6.2带约束的泛型方法
5.6.3带委托的泛型方法
5.6.4泛型方法规范
6.1同一类型和不同类型的多个对象
6.2简单数组
6.2.1数组的声明
6.2.2数组的初始化
6.2.3访问数组元素
6.2.4使用引用类型
6.3多维数组
6.4锯齿数组
6.5Array类
6.5.1创建数组
6.5.2复制数组
6.6数组作为参数
6.6.1数组协变
6.6.2ArraySegment&;T&;
6.7.1IEnumerator接口
6.7.2foreach语句
6.7.3yield语句
6.9结构比较
第7章运算符和类型强制转换
7.1运算符和类型转换
7.2.1运算符的简化操作
7.2.2运算符的优先级
7.3类型的安全性
7.3.1类型转换
7.3.2装箱和拆箱
7.4比较对象的相等性
7.4.1比较引用类型的相等性
7.4.2比较值类型的相等性
7.5运算符重载
7.5.1运算符的工作方式
7.5.2运算符重载的示例:Vector结构
7.6用户定义的类型强制转换
7.6.1实现用户定义的类型强制转换
7.6.2多重类型强制转换
第8章委托、lambda表达式和事件
8.1引用方法
8.2.1声明委托
8.2.2使用委托
8.2.3简单的委托示例
8.2.4Action&;T&;和Func&;T&;委托
8.2.5BubbleSorter示例
8.2.6多播委托
8.2.7匿名方法
8.3lambda表达式
8.3.2多行代码
8.3.4使用foreach语句的闭包
8.4.1事件发布程序
8.4.2事件侦听器
8.4.3弱事件
第9章字符串和正则表达式
9.1System.String类
9.1.1创建字符串
9.1.2StringBuilder成员
9.1.3格式字符串
9.2正则表达式
9.2.1正则表达式概述
9.2.2RegularExpressionsPlayaround示例
9.2.3显示结果
9.2.4匹配、组合和捕获
第10章集合
10.2集合接口和类型
10.3.1创建列表
10.3.2只读集合
10.7有序列表
10.8.1键的类型
10.8.2字典示例
10.8.3Lookup类
10.8.4有序字典
10.10可观察的集合
10.11位数组
10.11.1BitArray类
10.11.2BitVector32结构
10.12不变的集合
10.13并发集合
10.13.1创建管道
10.13.2使用BlockingCollection
10.13.3使用ConcurrentDictionary
10.13.4完成管道
第11章LINQ
11.1LINQ概述
11.1.1列表和实体
11.1.2LINQ查询
11.1.3扩展方法
11.1.4推迟查询的执行
11.2标准的查询操作符
11.2.1筛选
11.2.2用索引筛选
11.2.3类型筛选
11.2.4复合的from子句
11.2.5排序
11.2.6分组
11.2.7对嵌套的对象分组
11.2.8内连接
11.2.9左外连接
11.2.10组连接
11.2.11集合操作
11.2.12合并
11.2.13分区
11.2.14聚合操作符
11.2.15转换操作符
11.2.16生成操作符
11.3并行LINQ
11.3.1并行查询
11.3.2分区器
11.3.3取消
11.4表达式树
11.5LINQ提供程序
第12章动态语言扩展
12.2dynamic类型
12.3包含DLRScriptRuntime
12.4DynamicObject和ExpandoObject
12.4.1DynamicObject
12.4.2ExpandoObject
第13章异步编程
13.1异步编程的重要性
13.2异步模式
13.2.1同步调用
13.2.2异步模式
13.2.3基于事件的异步模式
13.2.4基于任务的异步模式
13.3异步编程的基础
13.3.1创建任务
13.3.2调用异步方法
13.3.3延续任务
13.3.4同步上下文
13.3.5使用多个异步方法
13.3.6转换异步模式
13.4错误处理
13.4.1异步方法的异常处理
13.4.2多个异步方法的异常处理
13.4.3使用AggregateException信息
13.5.1开始取消任务
13.5.2使用框架特性取消任务
13.5.3取消自定义任务
第14章内存管理和指针
14.1内存管理
14.2后台内存管理
14.2.1值数据类型
14.2.2引用数据类型
14.2.3垃圾回收
14.3释放非托管的资源
14.3.1析构函数
14.3.2IDisposable接口
14.3.3实现IDisposable接口和析构函数
14.4不安全的代码
14.4.1用指针直接访问内存
14.4.2指针示例:PointerPlayground
14.4.3使用指针优化性能
第15章反射
15.1在运行期间处理和检查代码
15.2自定义特性
15.2.1编写自定义特性
15.2.2自定义特性示例:WhatsNewAttributes
15.3.1System.Type类
15.3.2TypeView示例
15.3.3Assembly类
15.3.4完成WhatsNewAttributes示例
第16章错误和异常
16.2异常类
16.3捕获异常
16.3.1实现多个catch块
16.3.2在其他代码中捕获异常
16.3.3System.Exception属性
16.3.4没有处理异常时所发生的情况
16.3.5嵌套的try块
16.4用户定义的异常类
16.4.1捕获用户定义的异常
16.4.2抛出用户定义的异常
16.4.3定义用户定义的异常类
16.5调用者信息
第Ⅱ部分VisualStudio
第Ⅲ部分基础
第Ⅳ部分数据
显示部分信息前  言
对于开发人员,把C#语言及其相关联的.NET Framework环境描述为最重要的新技术一点都不夸张。.NET提供了一种环境。在这个环境中,可以开发在Windows上运行的几乎所有应用程序,而C#是专门用于.NET Framework的编程语言。例如,使用C#可以编写动态Web页面、Windows Presentation Foundation应用程序、XML Web服务、分布式应用程序的组件、数据库访问组件、传统的Windows桌面应用程序,甚或可以联机/脱机运行的新型智能客户端应用程序。本书介绍.NET Framework4.5.1。如果读者使用以前的版本编码,本书的一些章节就不适用。本书将标注出专用于.NET Framework 4.5和4.5.1的新增内容。
不要被这个架构名称中的.NET所迷惑,认为这是一个只关注Internet的架构。这个名称中的.NET仅强调Microsoft相信分布式应用程序是未来的趋势,即处理过程分布在客户端和服务器上。理解C#不仅仅是编写Internet或网络识别应用程序的一种语言也很重要。它还提供了一种编写Windows平台上几乎任何类型的软件或组件的方式。另外,C#和.NET都对开发人员编写程序的方式进行了革新,更易于实现在Windows上的编程。
那么,.NET和C#有什么优点?
.NET和C#的重要性
为了理解.NET的重要性,就一定要了解过去20年来出现的许多Windows技术的本质。尽管所有Windows操作系统在表面上看来完全不同,但从Windows 3.1(1993年引入)到Windows 8.1和Windows Server 2012 R2,在内核上都有相同的Windows API用于Windows桌面和服务器应用程序。在我们转而使用Windows的新版本时,虽然API中增加了非常多的新功能,但这是一个演化和扩展API的过程,并非替换它。
在Windows 8中,操作系统的主API被Windows运行库替代。但这个运行库仍部分基于Windows API。
开发Windows软件所使用的许多技术和架构也是这样。例如,组件对象模型(Component Object Model,COM)源自对象链接和嵌入(Object Linking and Embedding,OLE)。最初,因为它在很大程度上仅把不同类型的Office文档链接在一起,所以利用它,例如,可以把一个小型Excel电子表格放在Word文档中。之后,它逐步演化为COM、DCOM(Distributed COM,分布式组件对象模型)和最终的COM+。COM+是一种复杂的技术,它是几乎所有组件通信方式的基础,实现了事务处理、消息传输服务和对象池。
Microsoft选择这种软件革新方法的原因非常明显:它关注后向兼容性。在过去的这些年中,人们编写了大量Windows第三方软件,如果Microsoft每次都引入一项不遵循现有基本代码的新技术,Windows就不会获得今天的成功。
后向兼容性是Windows技术的极其重要的功能,也是Windows平台的一个长处。但它有一个很大的缺点:每次某项技术更新换代,增加了新功能后,它都会比以前更复杂。
很明显,对此必须改进。Microsoft不可能一直扩展相同的开发工具和语言,总是使它们越来越复杂,既要保证能跟上最新硬件的发展步伐,又要与20世纪90年代初开始流行的Windows产品向后兼容。如果要得到一系列简单而专业的语言、环境和开发工具,让开发人员轻松地编写一流的软件,就需要一个新的开端。
这就是C#和.NET的作用。粗略地说,.NET是一种在Windows平台上编程的架构—— 一种API。C#是一种从头开始设计的用于.NET的语言,它可以利用.NET Framework及其开发环境中的所有新增功能,以及在最近25年来出现的面向对象的编程方法。
在继续介绍前,必须先说明,后向兼容性并没有在这个演化进程中丧失。现有的程序仍可以使用,.NET也兼容现有的软件。现在,在Windows上软件组件之间的通信几乎都使用COM实现。因此,.NET能够提供现有COM组件的包装器(wrapper),以便.NET组件与之通信。
我们不需要学习了C#才能给.NET编写代码,因为Microsoft已经扩展了C++,还对Visual Basic进行了很多改进,把它转变成了功能更强大的语言,并允许把用这些语言编写的代码用于.NET环境。但其他这些语言都因有多年演化的遗留痕迹,并非一开始就用现在的技术来编写,导致它们不能用于.NET环境。
本书将介绍C#编程技术,同时提供.NET体系结构工作原理的必要背景知识。我们不仅会介绍C#语言的基础,还会给出使用各种相关技术的应用程序对应的示例,包括数据库访问、动态的Web页面、高级的图形和目录访问等。
Windows API自从1993年发布的Windows NT以来一直在演化和扩展,但自从2002年以来,.NET Framework对程序编写方式进行了重大的修改,2012年又进行了一次很大的改动。每10年就会发生这种改变吗?Windows 8现在提供了一种新的API:用于Windows Store应用程序的Windows运行库(WinRT)。这个运行库是一个本机API(类似于Windows API),它没有把.NET运行库作为其核心,但提供了基于.NET理念的非常好的新功能。Windows 8包含这个API的第一个版本,可用于现代模式的应用程序。尽管它不基于.NET,但仍可以将.NET的一个子集应用于Windows Store应用程序,用C#编写该应用程序。这个新的运行库正在演化,在Windows 8.1中包含它的版本2。本书也讨论了如何使用C#和WinRT编写Windows Store应用程序。
.NET的优点
前面阐述了.NET的优点,但并没有说它会使开发人员的工作更易完成。本节将简要讨论.NET的一些功能。
● 面向对象编程:.NET Framework和C#从一开始就完全基于面向对象的原则。
● 优秀的设计:一个基类库,它以一种非常直观的方式设计出来。
● 语言无关性:在.NET中,Visual Basic、C#和托管C++等语言都可以编译为通用的中间语言(Intermediate Language)。这说明,语言可以用以前没有的方式交互操作。
● 对动态Web页面的更好支持:虽然经典ASP具有很大的灵活性,但效率不是很高,这是因为它使用了解释性的脚本语言,且缺乏面向对象的设计,从而导致ASP代码比较混乱。.NET使用ASP.NET,为Web页面提供了一种集成支持。使用ASP.NET,可以编译页面中的代码,这些代码还可以使用.NET能识别的高级语言来编写,如C#或Visual Basic 2013。.NET现在还添加了对最新Web技术的重要支持,如Ajax和jQuery。
● 高效的数据访问:一组.NET组件,统称为ADO.NET,提供了对关系数据库和各种数据源的高效访问。这些组件也可用于访问文件系统和目录。尤其是,.NET内置了XML支持,可以处理从非Windows平台导入或导出的数据。
● 代码共享:.NET引入了程序集的概念,替代了传统的DLL,可以完美无瑕地改进代码在应用程序之间的共享方式。程序集是解决版本冲突的正式设备,程序集的不同版本可以并存。
● 增强的安全性:每个程序集还可以包含内置的安全信息,这些信息可以准确地指出哪种类型的用户或进程可以调用什么类的哪些方法。这样就可以非常准确地控制用户部署的程序集的使用方式。
● 对安装没有任何影响:有两种类型的程序集,分别是共享程序集和私有程序集。共享程序集是可用于所有软件的公共库,而私有程序集只用于特殊软件。由于私有程序集完全自包含,因此安装过程非常简单。没有注册表项,只需要把相应的文件放在文件系统的相应文件夹中即可。
● Web服务的支持:.NET完全集成了对开发Web服务的支持,用户可以轻松地开发任何类型的应用程序。
● Visual Studio 2013:.NET附带了一个Visual Studio 2013开发环境,它同样可以很好地利用C++、C#、Visual Basic 2013和ASP.NET或XML进行编码。Visual Studio 2013集成了这个IDE所有以前版本中的各种语言专用环境中的所有最佳功能。
● C#:是使用.NET的一种面向对象的强大且流行的语言。
第1章将详细讨论.NET体系结构的优点。
.NET Framework 4.5和4.5.1中的新增特性
.NET Framework的第1版(1.0版)在2002年发布,赢得了许多人的喝彩。.NET Framework 2.0在2005年发布,是该架构的一个主要版本。2.0版本的主要新特性是C#和运行库中对泛型的支持(为泛型修改了IL代码)、新类和接口。.NET 3.0以2.0运行库为基
显示部分信息在线试读部分章节
2.1 C#基础
理解了C#的用途后,就可以学习如何使用它了。本章将介绍C#的基础知识,本章的内容也是后续章节的基础,好的开端等于成功的一半。阅读完本章后,读者就有足够的C#知识编写简单的程
序了,但还不能使用继承或其他面向对象的特征。这些内容将在后面的几章中讨论。
2.2 第一个C#程序
下面编译并运行最简单的C#程序,这是一个简单的控制台应用程序,它由把某条消息写到屏幕上的一个类组成。
2.2.1 代码
在文本编辑器(如Notepad)中输入下面的代码,把它保存为后缀名为.cs 的文件(如First.cs)。Main()方法如下所示(更多信息参见2.7 节):
namespace Wrox
public class MyFirstClass
static void Main()
Console.WriteLine(“Hello from Wrox.”);
Console.ReadLine();
2.2.2 编译并运行程序
对源文件运行C#命令行编译器(csc.exe),编译这个程序:后面几章会介绍许多代码示例。编写C#程序最常用的技巧是使用Visual Studio2013 生成一个基本项目,再添加自己的代码。但是,第Ⅰ部分的目的是讲授C#语言,为了简单起见,在第17 章之前避免涉及Visual Studio 2013。我们使代码显示为简单的文件,这样就可以使用任何文本编辑器输入它们,并在命令行上编译。
csc First.cs
如果使用csc 命令在命令行上编译代码,就应注意.NET 命令行工具(包括csc)只有在设置了某些环境变量后才能使用。根据安装.NET(和Visual Studio)的方式,这里显示的结果可能与你计算机上的结果不同。
编译代码,会生成一个可执行文件First.exe。在命令行或Windows Explorer 上,像运行任何可执行文件那样运行该文件,得到如下结果:
csc First.cs
Microsoft (R) Visual C# Compiler version 12.
For C# 5.0
Copyright (C) Microsoft Corporation. All rights reserved.
Hello from Wrox.
2.2.3 详细介绍
首先对C#语法做几个一般性的解释。在C#中,与其他C 风格的语言一样,大多数语句都以分号(;)结尾,语句可以写在多个代码行上,不需要使用续行字符。用花括号({})把语句组合为块。单行注释以两个斜杠字符开头(//),多行注释以一条斜杠和一个星号(/*)开头,以一个星号和一条斜杠(*/)结尾。在这些方面,C#与C++和Java 一样,但与Visual Basic 不同。分号和花括号使C#代码与VisualBasic 代码有差异很大的外观。如果你以前使用的是Visual Basic,就应特别注意每条语句结尾的分号。对于新接触C 风格语言的用户,忽略分号常常是导致编译错误的一个最主要的原因。另一个方面是,C#区分大小写,也就是说,变量myVar 与MyVar 是两个不同的变量。
在上面的代码示例中,前几行代码与名称空间有关(如本章后面所述),名称空间是把相关类组合在一起的方式。namespace 关键字声明了应与类相关的名称空间。其后花括号中的所有代码都被认为是在这个名称空间中。编译器在using 语句指定的名称空间中查找没有在当前名称空间中定义但在代码中引用的类。这非常类似于Java 中的import 语句和C++中的using namespace 语句。
namespace Wrox
在First.cs 文件中使用using 指令的原因是下面要使用一个库类System.Console。using System语句允许把这个类简写为Console(System 名称空间中的其他类也与此类似)。如果没有using,就必如果没有设置环境变量,有两种解决方法。第1 种方法是在运行csc 之前,从命令提示符窗口上运行批处理文件%Microsoft Visual Studio 2013%\Common7\Tools\vsvars32.bat。其中%Microsoft Visual Studio 2013%是Visual Studio 2013 的安装文件夹。
第2 种方法(更简单)是使用Visual Studio 2013 命令提示符代替通常的命令提示符窗口。
Visual Studio 2013 命令提示符在菜单“开始”|“程序”| Microsoft Visual Studio 2013|VisualStudio Tools 子菜单下。它只是一个命令提示符窗口,打开时会自动运行vsvars32.bat。
第2 章 核 心 C#须完全限定对Console.WriteLine()方法的调用,如下所示:
System.Console.WriteLine(“Hello from Wrox.”);
标准的System 名称空间包含了最常用的.NET 类型。在C#中做的所有工作都依赖于.NET 基类,认识到这一点非常重要;在本例中,我们使用了System 名称空间中的Console 类,以写入控制台窗口。C#没有用于输入和输出的内置关键字,而是完全依赖于.NET 类。接着,声明一个类MyFirstClass。但是,因为该类位于Wrox 名称空间中,所以其完整的名称是
Wrox.MyFirstCSharpClass:
class MyFirstCSharpClass
所有的C#代码都必须包含在一个类中。类的声明包括class 关键字,其后是类名和一对花括号。
与类相关的所有代码都应放在这对花括号中。
下面声明方法Main()。每个C#可执行文件(如控制台应用程序、Windows 应用程序和Windows服务)都必须有一个入口点——Main()方法(注意M大写):
public static void Main()
在程序启动时调用这个方法。该方法要么没有返回值(void),要么返回一个整数(int)。注意,在
C#中方法的定义如下所示:
[modifiers] return_type MethodName([parameters])
// Method body. NB. This code block is pseudo-code.
第一个方括号中的内容表示可选关键字。修饰符(modifiers)用于指定用户所定义的方法的某些特性,如可以在什么地方调用该方法。在本例中,有两个修饰符public 和static。修饰符public 表示可以在任何地方访问该方法,所以可以在类的外部调用它。修饰符static 表示方法不能在类的实例上执行,因此不必先实例化类再调用。这非常重要,因为我们创建的是一个可执行文件,而不是类库。把返回类型设置为void,在本例中,不包含任何参数。
最后,看看代码语句:
Console.WriteLine(“Hello from Wrox.”);
Console.ReadLine();
在本例中,我们只调用了System.Console 类的WriteLine()方法,把一行文本写到控制台窗口上。WriteLine()是一个静态方法,在调用之前不需要实例化Console 对象。
Console.ReadLine()读取用户的输入,添加这行代码会让应用程序等待用户按回车键,之后退出几乎所有的C#程序都使用System 名称空间中的类,所以假定本章所有的代码文
件都包含using S语句。
应用程序。在Visual Studio 2013 中,控制台窗口会消失。
然后调用return 退出该方法(因为这是Main 方法,所以也退出了程序)。在方法头中指定void,因此没有返回值。
对C#基本语法有了大致的认识后,下面就详细讨论C#的各个方面。因为没有变量不可能编写出重要的程序,所以首先介绍C#中的变量。
在C#中声明变量使用下述语法:
该语句声明int 变量i。编译器不允许在表达式中使用这个变量,除非用一个值初始化了该变量。
声明i 之后,就可以使用赋值运算符(=)给它赋值:
还可以在一行代码中声明变量,并初始化它的值:
int i = 10;
如果在一条语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:
int x = 10, y =20; // x and y are both ints
要声明不同类型的变量,需要使用单独的语句。在多个变量的声明中,不能指定不同的数据类型:
int x = 10;
bool y = // Creates a variable that stores true or false
int x = 10, bool y = // This won’t compile!
注意上面例子中的“//”和其后的文本,它们是注释。“//”字符串告诉编译器,忽略该行后面的文本,这些文本仅为了让人更好地理解程序,它们并不是程序的一部分。本章后面会详细讨论代码中的注释。
2.3.1 变量的初始化
变量的初始化是C#强调安全性的另一个例子。简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待。这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值。
C#有两个方法可确保变量在使用前进行了初始化:
● 变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其默认值就是0(类和结构在后面讨论)。
● 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。
例如,在C#中不能使用下面的语句:
public static int Main()
Console.WriteLine(d); // Can’t do this! Need to initialize d before use
注意在这段代码中,演示了如何定义Main(),使之返回一个int 类型的数据,而不是void。在编译这些代码时,会得到下面的错误消息:
Use of unassigned local variable ‘d’
考虑下面的语句:
Something objS
在C#中,这行代码仅会为Something 对象创建一个引用,但这个引用还没有指向任何对象。对该变量调用方法或属性会导致错误。
在C#中实例化一个引用对象需要使用new 关键字。如上所述,创建一个引用,使用new 关键字把该引用指向存储在堆上的一个对象:
objSomething = new Something(); // This creates a Something on the heap
2.3.2 类型推断
类型推断(type inference)使用var 关键字。声明变量的语法有些变化。编译器可以根据变量的初始化值“推断”变量的类型。例如:
int someNumber = 0;
var someNumber = 0;
未经允许不得转载: &

我要回帖

更多关于 python高级编程 的文章

 

随机推荐