本书是将Java编程经验迁移到.NET环境的权威性指南对于Java程序员而言,正确理解C#和Java这两种语言的异同才能够快速地使用C#语言开发Windows应用程序。本书中所采用的大量代码(均在Visual Studio,NET 2003和Java 1.4版本平台上进行了测试)向读者展示了如何将Java编程经验应用到C#编程中,以创建出功能丰富的.NET应用程序。
作者首先详细描述了.NET Framework的知识,随之向读者介绍了代码编写的方法和Visual Studio,NET集成开发环境(旧E)的内容。本书将C#和Java的不同特点进行了归纳比较并系统分析了这两种语言之间的关系。读者从中将学习到C#编程的实质——从对象创建到事件编程,以及更多高级的知识如数据库访问、XML处理,GUI编程和反射技术等等。
第一部分C#基础
第1章.NETFramework
1.1什么是.net
1.2.NETFramework的术语和核心概念
1.2.1公共语言运行库
1.2.2托管代码
1.2.3MSIL
1.2.4程序集
1.2.5应用程序域
1.2.6运行时宿主
1.2.7通用类型系统(CTS)
1.2.8通用语言规范
1.3CLR和JVM
1.3.1.NETMSIL
1.3.2.NETJIT
1.3.3Java虚拟机
1.4内存管理
1.4.1CLR中的垃圾回收
1.4.2JVM中的垃圾回收
1.5安全管理
1.5.1基于代码凭证的策略驱动安全性
1.5.2基于角色的安全、鉴定和授权
1.5.3隔离存储
1.5.4密码(Cryptography)
1.5.5Java中的安全
1.6异常管理
1.6.1CLR中的异常管理
1.6.2Java中的异常管理
1.7.NETFramework类库概览
1.8小结
第2章C#起步
2.1.NETSDK
2.2编写第一个C#序
2.3C#的性能
2.4C#32具
2.4.1VisualStudio.NET
2.4.2中间语言分析器
2.5小结
第3章C#和Java的区别
3.1编程平台(.NET和Java)
3.1.1Java平台
3.1.2.NET套件
3.1.3表示层
3.1.4业务逻辑层
3.1.5数据层
3.2运行时体系结构
3.2.1Java虚拟机
3.2.2公共语言运行库
3.2.3ASPNET
3.2.4InternetExplOru
3.2.5可执行命令解释器
3.3OOP模型
3.4语言结构、语法和API
3.4.1数据类型
3.4.2运算符
3.4.3流控制语句
3.4.4异常处理支持
3.4.5公共对象
3.4.6公共语言元素
3.4.7集合库
3.4.8线程
3.4.9输入/输出
3.4.10命名空间和程序集
3.4.11Java中所缺少的部分
3.4.12C#缺少的部分
3.5小结
第4章对象
4.1创建对象java.1ang.Object的C#等价类
4.2类
4.2.1类修饰符
4.2.2类的访问修饰符和继承
4.3构造函数
4.4方法
4.4.1public
4.4.2prOtected
4.4.3private
4.4.4internal
4.4.5static
4.4.6sealed
4.4.7extern
4.4.8unSafe
4.4.9virtual
4.4.10override
4.4.11abstract
4.4.12new
4.4.13方法继承
4.4.14方法重载
4.4.15方法的参数
4.5字段
4.5.1public
4.5.2private
4.5.3prolected
4.5.4internal
4.5.5COnSt
4.5.6readonly
4.5.7stadc
4.5.8volatile
4.6属性继承和属性
4.7变量作用域
4.8对象的销毁
4.9小结
第5章继承和多态性
5.1继承
5.2多态性和虚方法
5.3C#的多态性
5.3.1virtual和override关键字
5.3.2参数的作用和转换规则
5.4方法和继承
5.4.1访问修饰符
5.4.2base关键字
5.4.3静态方法和继承
5.4.4抽象方法和继承
5.5强制类型转换
5.6组合与继承
5.7小结
第6章接口
6.1基本接口C#接口和Java接口的区别
6.2多个接口和显式接口声明
6.3接口的继承
6.4as运算符
6.5小结
第7章数据类型
7.1Java的值类型
7.2Java引用类型
7.3C#值类型
7.3.1结构类型
7.3.2枚举类型
7.4内置值类型
7.4.1内置整数值类型
7.4.2内置浮点类型
7.4.3内置的Decimal值类型
7.4.4内置的布尔值类型
7.4.5显式类型转换
7.5C#引用类型
7.6装箱和拆箱
7.6.1装箱
7.6.2拆箱
7.6.3typeof运算符
7.7不安全代码
7.8小结
第8章运算符
8.1数学运算符
8.2逻辑运算符
8.3位运算符
8.3.1&运算符
8.3.21运算符
8.3.3^运算符
8.3.4一运算符
8.4字符串连接运算符
8.5增量和减量运算符
8.6位移运算符
8.6.1<>运算符
8.7关系运算符
8.7.1==运算符
8.7.21=运算符
8.7.3运算符
8.7.5<=运算符
8.7.6>=运算符
8.8赋值运算符
8.8.1=运算符
8.8.2+=运算符
8.8.3-=运算符
8.8.4*=运算符
8.8.5/=运算符
8.8.6%=运算符
8.8.7&=运算符
8.8.81=运算符
8.8.9^=运算符
8.8.10>>=运算符
8.8.11<<=运算符
8.9成员访问运算符
8.10强制类型转换运算符
8.11索引运算符
8.12条件运算符
8.13创建对象运算符
8.14类型信息运算符
8.14.1is运算符
8.14.2as运算符
8.14.3sizeof运算符
8.14.4typeof运算符
8.15溢出异常控制
8.15.1checked运算符
8.15.2unchecked运算符
8.16指针类型运算符
8.17运算符优先级
8.18运算符重载
8.19小结
第9章基本控制流
9.1if语句
9.2while循环
9.3dowhile循环
9.4for循环
9.5switch语句
9.6foreach语句
9.7跳转语句
9.8小结
第10章异常
10.1try-catch-finally结构的基本原理
10.2自定义异常
10.3继承和异常
10.4CLR异常
10.5设计中需要考虑的事项
10.5.1简单地抛出
10.5.2捕获、整理并重新抛出
10.5.3捕获、整理并重新抛出不同的异常
10.6小结
第11章数组
11.1Java数组与C#数组
11.1.1Java数组
11.1.2C#数组
11.2一维数组
11.3多维数组
11.4锯齿状数组
11.5复制数组
11.6数组作为集合
11.7小结
第12章字符串
12.1System.String类
12.2初始化字符串
12.3+运算符和字符串
12.4正则表达式
12.5小结
第13章格式化数字、字符串和日期
13.1格式化
13.2数字格式化
13.2.1货币格式化
13.2.2科学格式化
13.2.3数字、定点数和通用格式化
13.2.4百分数格式化
13.2.5自定义说明符
13.2.6段、十六进制和转义说明符
13.3格式化日期和时间
13.4格式化自定义对象
13.5解析
13.6小结
第14章集合
14.1System.CoUections接口
14.2System.Collections类
14.2.1线程安全
14.2.2类型安全
14.2.3不可变性
14.2.4可访问性
14.3使用System.Collections类
14.3.1AmyList
14.3.2BitArray
14.3.3散列表(Hashtable)
14.3.4队列(Queue)
14.3.5栈(Stack)
14.3.6有序列表(SortedList)
14.3.71Comparer
14.3.81HashCodeProvider
14.3.91Enumerator
14.4类型安全的集合
14.5自定义集合
14.6小结
第15章C#的UOAPI
15.1流
15.2FileStream类
15.3BufferedStream类
15.4MemoryStream类
15.5NetworkStream类
15.6读取器和写入器
15.7文件和目录
15.7.1Append ext
15.7.2Exists、Copy、Move和Delete
15.7.3Open、OpenWrite、OpenTE和OpenRead+
15.7.4异步I/O
15.8序列化
15.8.1基本序列化
15.8.2自定义序列化
15.9小结
第16章线程编程
16.1System.Threading命名空间
16.2使用System.Threading.Thread类创建线程
16.2.1启动线程
16.2.2线程的生命周期
16.3在C#中安全地停止线程
16.3.1使用System.Threading.ThreadPool类创建线程
16.3.2使用System.Threading.Timer类创建线程
16.3.3使用异步回调创建线程
16.4线程同步ReaderWriterLock类
16.5互锁操作
16.6小结
第17章C#的属性、索引器和特性
17.1属性
17.2索引器
17.2.1整数索引的索引器
17.2.2字符串索引的索引器
17.2.3多个索引的索引器
17.3特性
17.4小结
第18章委托和事件编程
18.1使用委托
18.2多播
18.3事件编程
18.4小结
第二部分高级C#
第19章访问数据库
19.1ADO.NET概述
19.2JDBC2.0+
19.3ADO.NET入门
19.3.1建立与数据库的连接
19.3.2执行SELECT查询获得数据
19.3.3执行INSERT、UPDATE和DELETE查询
19.3.4执行存储过程
19.3.5事务处理
19.3.6察看数据库元数据
19.4数据集
19.4.1把数据装入数据集
19.4.2使用数据集把数据存储到数据库中
19.5小结
第20章处理XML
20.1Java对XML的支持
20.2XML和.NET
20.3读写XML
20.3.1在.NET中读取XML
20.3.2在.NET中写XML
20.4在.NET中使用DOMAPI
20.4.1XPath.
20.4.2XSLT
20.5小结
第21章C#中的GUI程序设计
21.1选择GUI库:Java还是.NET
21.2使用IDE开发小型应用程序
21.2.1创建新的项目
21.2.2设计窗体
21.2.3修改窗体
21.3Windows窗体、组件控件及其相关的.NET类
21.4使用GUI控件的综合实例
21.4.1应用程序的功能
21.4.2应用程序的源文件
21.4.3应用程序控件
21.5锚定和停靠
21.5.1锚定
21.5.2停靠
21.6使用.NETGUI绘图
21.6.1System.Drawing
21.6.2双缓冲
21.6.3示例绘图程序
21.7小结
第22章反射
22.1核心反射类
22.2浏览和查询成员
22.3调用加法、设置字段和属性
22.4使用反射发放生成动态几
22.5小结
第23章程序集、应用程序配置和进程管理
23.1.NET程序集
23.1.1程序集清单
23.1.2模块
23.1.3资源
23.2创建程序集
23.3编程访问程序集
23.4版本管理
23.5应用程序配置
23.5.1单标记段
23.5.2名称/值段
23.5.3词典段
23.5.4示例配置文件
23.6进程管理
23.6.1查询当前应用程序域
23.6.2在远程应用程序域中执行应用程序
23.6.3在远程应用程序域中调用方法
23.6.4查询进程
23.6.5创建和终止进程
23.6.6重定向进程输出
23.6.7检测进程完成情况
23.6.8退出进程
23.7小结
附录Java与C#中API的比较
A.1java.1ang包
A.2iava.util包
A.3java.io包
A.4java.sql包
A.5iava.text包
A.6org.w3c.dom包
A.7javax.swing包
A.8iava.awt包
微软发布的C#语言是开发.NET应用程序的核心语言之一,它与Sun Microsystems的Java编程语言有着惊人的相似之处。虽然如此,二者在编程方法论以及语法、结构方面仍有很大的不同和差异。在您兴趣盎然地将Java技巧应用到C#的过程中,很容易会忽略这些差异。每一种语言都有自己的良好编码习惯,Java中好的编码习惯在C#就不一定是好的编码习惯。本书旨在从Java程序员的角度去认识C#的基本原理,并在强调C#的良好编码习惯的同时,揭示出这两种语言之间的不同。
本书特色
本书是由程序员执笔、为程序员同行所编写的,所以您会发现本书在代码方面着墨很多,但在描述方面则惜墨如金。您也会注意到本书使用了完整的例子来介绍C#的概念、结构、语法和编程思想。在适当的地方,本书还提供了Java代码清单。这些代码清单有时相当重要,它们可以。帮助您了解我们所介绍的各种概念。这种做法与一些Java开放源代码的教程类似。 .
作为Java程序员,您将会注意到本书剖析了一些Java异常情况和代码习惯,以便了解C#中是否也有类似情况。另外,还研究了C#的一些特性,以揭示为什么Java中没有这些特性以及C#中对这些特性进行不同设计的原因。书中有些地方给出了C#中被视为冗余的Java编码习惯。比如说,在Java世界里,用“+”操作符将字符串连接成长字符串是备受抨击的,但在C#中就未必是一件坏事。
本书每章的代码清单都是独立的,没有采用以一个大型应用程序贯穿全书的方式。另外要注意的是,本书重点讨论C#语言,而不是.NET开发环境所附带的各种相关工具。本书读者对象
正如书名所述,本书是为广大的Java程序员量身定制的。读了本书以后,那些经常使用Java编程的人在学习C#时能少走很多弯路。如果您没有用Java编过程序,应该熟悉面向对象编程(OOP)的基本原理,并曾经使用面向对象的语言(如C十+或者Smalltalk)编过程序。如果您不熟悉面向对象的编程技术,那么建议您首先学习面向对象的编程技巧,在掌握了类、接口、对象和多态性的应用后,再来看C#。
各章概述
尽管您可以出于了解C#概念的目的,随意参阅本书任一章节,但推荐您按照顺序阅
读全书。这样,在探讨更深奥复杂的应用程序接口。(APl)时,就不至于受到语法或者结
构问题的困扰,以下是各个章节的简要介绍。
第1章.NETFramework。本章概述了.NETFramework的各个不同组成部分。急于编写代码的读者可以跳过本章。
第2章C#起步。本章介绍了大家所熟知的“Hello World”程序,先在不使用IDE(.NET综合开发环境)的情况下进行开发,然后用IDE重新做了一遍。本章简要介绍了DE的各个组件。如果您要开发大型的企业级应用程序,那么IDE的知识非常重要;但如果只是想理解语言概念,就不需要非常精通IDE。
第3章C#和Java的区别。C#和Java的不同之处在哪里呢?本章列出了C#的特征,并把它们和Java中的相应特征进行比较。本章对于那些想尽快知道C#和Java区别的人来说是很好的阅读材料。
第4章对象。本章正式开始介绍面向对象编程:编写对象。Java的编程过程和编写类紧密相关。
第5章继承和多态性。本章是所有面向对象编程语言的基石。Java和C#都采用了单根类层次结构,并且都具有多态性。作为Java编程人员,可能己习惯了Java始终处于打开状态的自动虚拟调度,而C#的方法则是将虚拟调度默认设置为关闭。对于Java程序员来说,这意味着什么呢?本章举例说明了C#隐藏的一些陷阱,如果Java程序员粗心大意的话就很容易陷进去。
第6章接口。本章介绍Java和C#都允许一个类实现多个接口的内容。此处讨论了C#接口的几个方面。
第7章数据类型。本章探讨编程语言的各个构成要素。C#提供的数据类型和结构比Java多得多。如果想使用C#的特有结构,又不满足于仅仅在C#中编写类,就应该仔细阅读本章。
第8章运算符。本章的主题虽然普通,但十分重要。当了解到C#支持运算符重载时,您或许会很惊讶。
第9章基本控制流。本章讨论控制流语句,比如“if-then-else”、 “switch”、“for”、 “foreach”等。C#是一种表现力很强的语言,包含一些结构的内置优化机制。您将会知道C#允许在“switch”语句中使用字符串,像这样令人惊奇的细节在C#中还有很多。
第10章异常。本章介绍如何处理过去是C++中的选项、而现在是Java语言主要构成部分的内容。幸运的是C#和Java都将异常处理作为它们的核心部分;遗憾的是C#中没有“throws”语句。那么如何才能知道所调用的方法抛出了哪些异常呢?Java程序员可能会觉得C#对于异常的“宽大”处理既可爱又可恨。
第11章数组。本章介绍这种基本数据结构,它是所有编程语言的构成内容。C#中的数组有一个特殊的类,这比大多数编程语言更进了一步。
第12章字符串。本章介绍Java中最普遍使用的一个类,同时也是C#中最普遍使用的一个类。本章讨论了字符串等式、字符串限定和优化的基本概念。
第13章格式化数字、字符串和日期。本章讨论“Java.text.*”包在C#中的等价内容。
第14章集合。本章介绍Java和C#集合如何让您在不从头开始的情况下完成设计。不过, 目前C#的集合库和Java所提供的集合库还不匹配。
第15章C#的I/OAPI。本章讨论I/0流、文件、目录以及串行化。C#对文件和目录做了区分,并且给出了对类进行串行化的多种方式。
第16章线程编程。本章介绍了C#简化线程的方法。您可以干脆关闭C#中的线程,它会给出一个由系统提供的线程池。这意味着再也不必采用任何第三方的实现了。您可以在资源上设置读写锁,这是JDK所没有提供的。另外,C#提供了4种编写多线程类的不同方法。本章中还展示了更多其他的令人惊奇之处。
第17章C#的属性、索引器和特性。本章内容可能会唤醒那些曾用过VB的Java程序员久已遗忘的记忆。使用属性可省掉大量的“getter”、 “setter”函数,从而减少了代码的混乱。索引器可让您将集合当作数组进行处理,而特性则允许您修补代码的元数据。这些特点都是Java所没有的。
第18章委托和事件编程。本章解释了为什么在Java中被抛弃的函数指针,又被作为“委托”重新出现在C#中。我们还举了另外一个例子,以说明为什么C#没有把所有的概念或结构构造成类模型。
第19章访问数据库。本章介绍数据库访问能力,它是核心.NET API的一部分。C#有一个独特的数据结构——“RowSet”对象,该对象一般是RDBMS(关系数据库管理系统)的表或者视图在内存中的代表。本章中讨论了一些常用的数据库操作。
第20章处理XML。本章揭示了最终加入Javal.4核心API的XML处理实际上是C#最重要的概念之一。在C#的核心库中,可获得对于XML、XSL转换以及XPath的内嵌支持。
第21章C#中的GUI程序设计。本章为GUI设计人员提供了很多实用的建议。JavaSwing库已成了设计客户端Java GUI应用程序的首选API。Swing库由许多用MVC(model view controller,模视图控制器)模式建模的类组成。虽然Swing已经高度模块化,但由于没有给JDK配备GUI设计器,所以其使用仍然比较单调乏味。因为必须全部手工进行编码,所以设计复杂的、交互的屏幕就成了一件繁琐的事情。只是最近出现的一些第三方JavaIDE才简化了Swing的编程。与之相反,.NETWindows窗体库则让人想起Visual Basic的拖放式窗体,它带有与窗体控制相关的事件驱动代码。如果您手边有Visual Studio.NET,那么C#中的GUI编程就简化为拖放、添加事件驱动代码。对于筋疲力尽的Swing编程人员来说,.NETFormsDesigner将是一个备受欢迎的修改。
第22章反射。本章阐述反射能力与托管代码、类型安全数据类型的密切配合。反射可让设计人员探查各种语言结构之后的元数据,C#和Java都提供了充分的反射API类集。但是由于C#反射具有发放(emit)特点,支持动态生成和运行MSIL代码,所以是最佳选择。
第23章程序集、应用程序配置和进程管理。本章说明打包是最重要的部分。对于计算机应用程序而言,这是确定无疑的。打包或部署不适当的应用程序要么会不工作,要么会在运行期间发生令人头疼的问题。C#程序集能够把复杂的应用程序作为一个单元来部署,该单元可带版本标志。C#也提供了几个深入到Windows操作系统进程管理内的“挂钩(hook)”。请阅读本章中关于程序集和进程的所有内容。
本书所用代码样式代码的书写习惯各种各样,您应该坚持使用所在编程团队或组织所采用的样式习惯。
本书使用不同的字体样式来区分代码和普通文本。本书中书写代码时,使用Java样式的
变量名称而不使用匈牙利命名法。比如,本书采用
intcount;
而不是
intm_IntCount;
方法名称遵从Pascal约定,而不是Java的“Camel”约定,所以在Java中形如
getName()
的方法名被转换成
GetName()。
循环和流程控制声明遵从“Slanting”样式,左大括号出现在行的末尾,右大括号出现在行的开头:
for(ihti:0;i<100;i+十){
//codegoeshere
)
在采用了某特定步骤而读者又不了解为什么这么做的——些关键位置,本书会对代码做出注释。我们认为代码应该尽可能的具有自我说明性。通过使用有意义的变量名和方法名,在无需注释的情况—厂清晰地表达出方法要实现的意图,就可以做到这一点。比如,下面这个方法的意图就十分清晰:
publicvoidPrintProperties(objectO)
代码清单用于解释一个或几个概念。在保持代码趣味性的同时,本书将尽可能地使代码清单重点突出。当不值得用——个完整的类来说明某个概念的时候,将采用摘录的代码块。
作者的话
编写本书对我们来说也是一个很好的学习机会。我们惊喜地发现,除了少数的例外,C#和Java的差别并不大。作为Java程序员的读者应该已经掌握了基本的编程策略、模式和习惯用语,这些都是过去在Java世界中编程常用的,可以很容易地把大多数经验运用到C#世界中。
我们发现这,两种语言的主要差别是:Java强调一致性,它把所有的东西都建模成类;而C#则拥有很多不是类的编程结构,如枚举、结构体、属性、索引器、委托和指针。这意味着在C#中仍然可以把所有东西都构造成类,但也将因此无法利用某些C#结构中的内置效率。这些结构还可使结果代码更具表现力。基于上述考虑,鼓励大家尽可能地使用C#的结构。
最后建议大家使用Visual Studio.NET IDE。这在C#编程中并非必需,但推荐大家使用,因为它有助于尽快制作出应用程序,并减少快速设计大型应用程序时的枯燥乏味。关于作者 在过去的五年里,Jawahar Puvvala一直使用Sun和Microsoft技术为高技术公司开发企业级应用程序。Jawahar Puvvala是Nucor公司的一名顾问,该公司位于北卡罗来纳州的夏洛特。从事建筑工程方面的工作让Jawahar成为一名程序专家。他的教育背景是用C++为机械和建筑工程系统编写矩阵分析软件。今天,他专门研究各种不同的技术和语言下的客户机朋艮务器应用程序和分布式应用程序开发,包括COM+、MFC、ATL、ASP、MSMQ、XML、XSLT、DCOM、SOAP、C++、C#、Java和Visual Basic。他发表过几篇建筑工程方面的期刊文章和会议论文。
Jawahar用Java编写的第一个企业级应用程序是为纺织工业写的。虽然他并不是百分之百的纯Java程序员,但Java中接口编程的思想奠定了他在Microsoft技术COM/DCOM上成功的基础。
下班后,他会收拾房子和管理家庭网络,可通过jawahar@carolina.rr.com与他联系。
Alok Pota是一个Java迷,目前在德克萨斯首府奥斯汀的Digital Mototworks(DMl)公司担任J2EE程序开发人员。在过去的五年里,AlokPota一直用J2EE技术开发服务器端的企业应用程序,并不断获取最新和最好的Java技术。在使用Java前,他的专长是用Visual C+十、Visual Basic和FORTRAN编写科学数值分析和可视化软件。Alok出版的作品包括众多关于数学建模和专家系统方面的科技论文。
Alok是从用C++编写数值模型软件开始其程序,员生涯的。再加上建模技巧和对人工智能领域的兴趣,这些经历帮助他编写了一个基于专家系统命令解释器CLIPS(CLanguage Integrated Productions System)的决策支持系统。当他接触到Java时候,他就从编写科技软件改行编写商务相关的软件。
当不阅读Java或者琢磨最新的API时,Alok喜欢和他的儿子RajiV一起玩耍,可以通过apota@austin.rr.com与他联系。
关于技术审阅人员
Mark Burhop是俄亥俄州辛辛那提市的一名高级软件工程师,也是辛辛那提大学附属系的——名成员。他拥有超过15年的开发计算机辅助工程和生产数据管理领域软件的经验,涉及的技术从Microsoft.NET(C#)到Java到C++。作为著作者,他目前正专注于介绍如何编写高性能的C#应用程序。关于Mark的更多信息以及他的作品,请访问:
http://www.markburhop.com‘
Howard Lee Harkness以编写软件为生。在近三十年的时间里,他用过超过一打的编程语言,并培训过其他程序员。他拥有德克萨斯大学的计算机科学学位,并使用过从军用嵌入式系统、汽车应用程序到基于Web的原材料账单系统的很多软件。空闲时,他喜欢到爱尔兰人的基督教长老会上拉小提琴。
Kevin T.Price是弗吉尼亚州维也纳城的高级技术专家,擅长安全和测量。多年来,他使用Microsoft工具集,从事过程序开发的各个方面。他也曾经撰写和编辑过有关XML、安全和.NET技术的许多章节和书籍。不在电脑上工作时,Kevin常常会下下厨或玩玩彩弹球,可以通过kpcrash@patriot.net与他联系。