新書推薦:
《
如见你
》
售價:HK$
51.3
《
人格阴影 全新修订版,更正旧版多处问题。国际分析心理学协会(IAAP)主席力作
》
售價:HK$
67.0
《
560种野菜野果鉴别与食用手册
》
售價:HK$
67.1
《
中国官僚政治研究(一部洞悉中国政治制度演变的经典之作)
》
售價:HK$
62.7
《
锂电储能产品设计及案例详解
》
售價:HK$
110.9
《
首辅养成手册(全三册)(张晚意、任敏主演古装剧《锦绣安宁》原著小说)
》
售價:HK$
121.0
《
清洁
》
售價:HK$
65.0
《
组队:超级个体时代的协作方式
》
售價:HK$
77.3
編輯推薦:
Wrox经典红皮书,屡获殊荣的C#名著和超级畅销书
长期位居C#开发类零售榜首,引领无数新手走入C#殿堂
最新版更新至C# 2012和.NET 4.5
2009、2011年度全行业优秀畅销品种
內容簡介:
《C#入门经典 系列是屡获殊荣的C#名著和超级畅销书。最新版的 C#入门经典第6版 面向编程新手,全面介绍使用C# 2012和.NET Framework编写程序的基础知识。本书无与伦比的作者团队与您分享多年积累的C#和.NET Framework使用经验,首先简明扼要地介绍这两种技术,解释其含义、相互关系以及使用原因,然后循序渐进地讨论编程基础知识、Web编程、桌面编程以及数据访问技术。本书的讲解详明透彻,以通俗易懂的方式分步骤解析大量基础性示例,为您提供了在实践中锻炼运用新学知识的机会。
主要内容
◆ 介绍编程基础知识,如变量、流程控制和面向对象编程
◆ 着重介绍初学者在编写C#程序时最常用的工具:Visual Studio 2012中的Visual C# 2012开发环境
◆ 阐述调试和错误处理
◆ 详细讲解集合、比较和转换,探讨C#语言的新增功能
◆ 深入分析WPF以及其他可用于创建和部署桌面应用程序的重要技术
◆ 探讨Windows Store应用程序
◆ 介绍ASP.NET Web编程和Web应用程序的部署
◆ 分析文件系统数据、XML和LINQ
關於作者:
Karli Watson是一位作者、IT承包商,现居伦敦。
Jacob Vibe Hammer是丹麦Kamstrup AS公司的一名软件架构师和开发人员。Jacob已与他人合著了多本图书。
Jon D Reid是Indigo Biosystems有限公司的系统工程总监。
Morgan Skinner自2001年就一直效力于Microsoft。
Daniel Kemper是一名软件工程师,专门研究报表和富客户端技术。
Christian Nagel是Microsoft技术代言人Microsoft RD、Microsoft MVP;Christian是Thinktecture的联合创始人,也是CN innovation的创始人。
目錄 :
目 录
第Ⅰ部分 C# 语 言
第1 章 C#简介 3
1.1 .NET Framework 的含义 3
1.1.1 .NET Framework 的内容 4
1.1.2 使用.NET Framework 编写应用程序 4
1.2 C#的含义7
1.2.1 用C#能编写什么样的应用程序 7
1.2.2 本书中的C# 8
1.3 Visual Studio 2012 8
1.3.1 Visual Studio Express 2012产品 9
1.3.2 解决方案 9
1.4 小结 9
1.5 本章要点 10
第2 章 编写C#程序 11
2.1 Visual Studio 2012 开发环境 12
2.2 控制台应用程序 14
2.2.1 Solution Explorer 窗口 17
2.2.2 Properties 窗口 18
2.2.3 Error List 窗口 18
2.3 桌面应用程序 19
2.4 小结 22
2.5 本章要点 22
第3 章 变量和表达式 23
3.1 C#的基本语法 24
3.2 C#控制台应用程序的基本结构 26
3.3 变量 27
3.3.1 简单类型 28
3.3.2 变量的命名 31
3.3.3 字面值 33
3.3.4 变量的声明和赋值 34
3.4 表达式 35
3.4.1 数学运算符 35
3.4.2 赋值运算符 39
3.4.3 运算符的优先级 39
3.4.4 名称空间 40
3.5 小结 43
3.6 练习 43
3.7 本章要点 44
第4 章 流程控制 45
4.1 布尔逻辑 45
4.1.1 布尔赋值运算符 48
4.1.2 按位运算符 49
4.1.3 运算符优先级的更新 52
4.2 goto 语句 53
4.3 分支 54
4.3.1 三元运算符 54
4.3.2 if 语句 55
4.3.3 switch 语句 58
4.4 循环 61
4.4.1 do 循环 62
4.4.2 while 循环 64
4.4.3 for 循环 66
4.4.4 循环的中断 70
4.4.5 无限循环 71
4.5 小结 72
4.6 练习 72
4.7 本章要点 73
第5 章 变量的更多内容 75
5.1 类型转换 75
5.1.1 隐式转换 76
5.1.2 显式转换 77
5.1.3 使用Convert 命令进行显式转换 80
5.2 复杂的变量类型 83
5.2.1 枚举 83
5.2.2 结构 87
5.2.3 数组 89
5.3 字符串的处理 95
5.4 小结 100
5.5 练习 100
5.6 本章要点 101
第6 章 函数 103
6.1 定义和使用函数 104
6.1.1 返回值 105
6.1.2 参数 107
6.2 变量的作用域 114
6.2.1 其他结构中变量的作用域 116
6.2.2 参数和返回值与全局数据 118
6.3 Main函数 119
6.4 结构函数 121
6.5 函数的重载 122
6.6 委托 124
6.7 小结 127
6.8 练习 127
6.9 本章要点 128
第7 章 调试和错误处理 129
7.1 Visual Studio 中的调试 130
7.1.1 非中断正常模式下的调试 130
7.1.2 中断模式下的调试 138
7.2 错误处理 145
7.2.1 try.catch.finally 146
7.2.2 列出和配置异常 150
7.2.3 异常处理的注意事项 151
7.3 小结 152
7.4 练习 152
7.5 本章要点 152
第8 章 面向对象编程简介 155
8.1 面向对象编程的含义 156
8.1.1 对象的含义 156
8.1.2 一切皆对象 159
8.1.3 对象的生命周期 159
8.1.4 静态和实例类成员 160
8.2 OOP 技术 161
8.2.1 接口 161
8.2.2 继承 163
8.2.3 多态性 164
8.2.4 对象之间的关系 166
8.2.5 运算符重载 167
8.2.6 事件 167
8.2.7 引用类型和值类型 168
8.3 桌面应用程序中的OOP 168
8.4 小结 171
8.5 练习 172
8.6 本章要点 173
第9 章 定义类 175
9.1 C#中的类定义 175
9.2 System.Object 180
9.3 构造函数和析构函数 182
9.4 Visual Studio 中的OOP 工具186
9.4.1 Class View 窗口 186
9.4.2 对象浏览器 187
9.4.3 添加类 188
9.4.4 类图 189
9.5 类库项目 190
9.6 接口和抽象类 193
9.7 结构类型 195
9.8 浅度和深度复制 197
9.9 小结 198
9.10 练习 198
9.11 本章要点 199
第10 章 定义类成员 201
10.1 成员定义 201
10.1.1 定义字段 202
10.1.2 定义方法 202
10.1.3 定义属性 203
10.1.4 在类图中添加成员 208
10.1.5 重构成员 211
10.1.6 自动属性 212
10.2 类成员的其他主题 212
10.2.1 隐藏基类方法 212
10.2.2 调用重写或隐藏的基类方法 214
10.2.3 嵌套的类型定义 215
10.3 接口的实现 217
10.4 部分类定义 221
10.5 部分方法定义 222
10.6 示例应用程序 224
10.6.1 规划应用程序 224
10.6.2 编写类库 224
10.6.3 类库的客户应用程序 231
10.7 Call Hierarchy窗口 232
10.8 小结 233
10.9 练习 233
10.10 本章要点 234
第11 章 集合、比较和转换 235
11.1 集合 236
11.1.1 使用集合 236
11.1.2 定义集合 242
11.1.3 索引符 243
11.1.4 给CardLib 添加Cards 集合 245
11.1.5 键控集合和IDictionary 248
11.1.6 迭代器 250
11.1.7 迭代器和集合 254
11.1.8 深度复制 254
11.1.9 给CardLib添加深度复制 257
11.2 比较 258
11.2.1 类型比较 258
11.2.2 值比较 263
11.3 转换 278
11.3.1 重载转换运算符 278
11.3.2 as运算符 279
11.4 小结 280
11.5 练习 281
11.6 本章要点 282
第12 章 泛型 283
12.1 泛型的概念 284
12.2 使用泛型 285
12.2.1 可空类型 285
12.2.2 System.Collections.Generic名称空间 292
12.3 定义泛型类型 301
12.3.1 定义泛型类 302
12.3.2 定义泛型接口 313
12.3.3 定义泛型方法 313
12.3.4 定义泛型委托 315
12.4 变体 315
12.4.1 协变 316
12.4.2 抗变 317
12.5 小结 317
12.6 练习 318
12.7 本章要点 319
第13 章 其他OOP 技术 321
13.1 ::运算符和全局名称空间限定符 321
13.2 定制异常 323
13.3 事件 325
13.3.1 事件的含义 325
13.3.2 处理事件 326
13.3.3 定义事件 328
13.4 扩展和使用CardLib 336
13.5 特性 344
13.5.1 读取特性 344
13.5.2 创建特性 345
13.6 小结 346
13.7 练习 347
13.8 本章要点 347
第14 章 C#语言的改进 349
14.1 初始化器 350
14.1.1 对象初始化器 350
14.1.2 集合初始化器 352
14.2 类型推理 355
14.3 匿名类型 356
14.4 动态查找 360
14.4.1 动态类型 361
14.4.2 IDynamicMetaObject-Provider 364
14.5 高级方法参数 365
14.5.1 可选参数 365
14.5.2 命名参数 367
14.5.3 命名参数和可选参数的规则 371
14.6 扩展方法 371
14.7 Lambda 表达式 375
14.7.1 复习匿名方法 375
14.7.2 把Lambda 表达式用于匿名方法 376
14.7.3 Lambda 表达式的参数 379
14.7.4 Lambda 表达式的语句体 380
14.7.5 Lambda 表达式用作委托和表达式树 381
14.7.6 Lambda 表达式和集合 381
14.8 调用方信息特性 384
14.9 小结 386
14.10 练习 387
14.11 本章要点 388
第15 章 基本桌面编程 393
15.1 XAML 394
15.1.1 关注点分离 394
15.1.2 XAML 基础知识 395
15.2 动手实践 396
15.2.1 WPF 控件 397
15.2.2 属性 398
15.2.3 事件 401
15.3 控件布局 405
15.3.1 堆叠顺序 406
15.3.2 对齐、边距、填充和尺寸 406
15.3.3 Border 控件 407
15.3.4 Canvas 控件 407
15.3.5 DockPanel 控件 408
15.3.6 StackPanel 控件 410
15.3.7 Grid 控件 412
15.4 游戏客户端 414
15.4.1 About 窗口 414
15.4.2 Options窗口 419
15.4.3 数据绑定 427
15.4.4 启动游戏 433
15.5 小结 436
15.6 练习 437
15.7 本章要点 437
第16 章 高级桌面编程 439
16.1 主窗口 439
16.1.1 菜单控件 440
16.1.2 路由命令和菜单 440
16.2 创建控件并设置样式 443
16.2.1 样式 444
16.2.2 模板 444
16.2.3 值转换器 448
16.2.4 触发器 450
16.2.5 动画 451
16.3 WPF 用户控件 453
16.4 把所有内容结合起来 462
16.4.1 重构域模型 463
16.4.2 视图模型 467
16.4.3 大功告成 475
16.5 小结 483
16.6 练习 484
16.7 本章要点 484
第17 章 Windows Store 应用程序 485
17.1 入门 485
17.2 Windows Store 应用程序与桌面应用程序 487
17.3 开发Windows Store应用程序 488
17.3.1 视图模式 488
17.3.2 磁贴和锁屏提醒 492
17.3.3 应用程序的生存期 492
17.4 应用程序的开发 492
17.4.1 WPF 与Windows Store应用程序的XAML 差异 493
17.4.2 模板和页面 494
17.4.3 沙箱应用程序 495
17.4.4 在页面之间导航 500
17.4.5 管理状态 503
17.5 修改KarliCards 游戏第1 部分 503
17.5.1 创建CardLib 项目 503
17.5.2 可视化方面的修改 511
17.5.3 转换用户控件 511
17.6 Windows Store 应用程序中的常见元素 518
17.6.1 AppBar 控件 518
17.6.2 设置面板 520
17.6.3 磁贴、锁屏提醒以及初始屏幕 523
17.7 修改KarliCards 游戏第2 部分 524
17.8 Windows 应用商店529
17.9 小结 530
17.10 练习 530
17.11 本章要点 531
第18 章 部署桌面应用程序 533
18.1 部署概述 534
18.2 ClickOnce 部署 534
18.2.1 实现ClickOnce 部署 535
18.2.2 用ClickOnce 安装应用程序 541
18.2.3 创建和使用应用程序的更新包 542
18.3 InstallShield Limited Edition 543
18.4 小结 549
18.5 练习 549
18.6 本章要点 549
第Ⅲ部分 Web 编 程
第19 章 ASP.NET Web 编程 553
19.1 Web 应用程序概述 554
19.2 ASP.NET 运行库 554
19.3 创建简单的Web页面 555
19.4 服务器控件.562
19.5 ASP.NET 回送 563
19.6 ASP.NET AJAX 回送 568
19.7 输入的有效性验证 571
19.8 状态管理 575
19.8.1 客户端的状态管理 576
19.8.2 服务器端的状态管理 578
19.9 样式 581
19.10 母版页 585
19.11 站点导航 589
19.12 身份验证和授权 592
19.12.1 身份验证的配置 593
19.12.2 使用安全控件 596
19.13 读写SQL Server数据库598
19.14 小结 607
19.15 练习 607
19.16 本章要点 607
第20 章 部署Web 应用程序 609
20.1 Internet Information Services 609
20.2 IIS 配置 611
20.3 复制Web 站点 612
20.4 发布Web 站点 615
20.5 小结 617
20.6 练习 618
20.7 本章要点 618
第Ⅳ部分 数 据 访 问
第21 章 文件系统数据621
21.1 流 621
21.2 用于输入和输出的类 622
21.2.1 File 类和Directory 类 623
21.2.2 FileInfo 类 624
21.2.3 DirectoryInfo类 625
21.2.4 路径名和相对路径 626
21.2.5 FileStream对象 626
21.2.6 StreamWriter对象 632
21.2.7 StreamReader对象 634
21.2.8 异步文件访问 641
21.2.9 读写压缩文件 641
21.3 序列化对象 644
21.4 监控文件系统 648
21.5 小结 653
21.6 练习 653
21.7 本章要点 654
第22 章 XML 655
22.1 XML 文档 656
22.1.1 XML 元素 656
22.1.2 特性 657
22.1.3 XML 声明 657
22.1.4 XML 文档的结构 658
22.1.5 XML 名称空间 658
22.1.6 格式良好并有效的XML 659
22.1.7 验证XML 文档 660
22.2 在应用程序中使用XML.663
22.2.1 XML 文档对象模型 663
22.2.2 选择节点 673
22.2.3 XPath 673
22.3 小结.677
22.4 练习.677
22.5 本章要点.678
第23 章 LINQ 简介 679
23.1 第一个LINQ 查询680
23.1.1 用var 关键字声明
结果变量 681
23.1.2 指定数据源:from 子句 682
23.1.3 指定条件:where 子句 682
23.1.4 选择元素:select 子句 682
23.1.5 完成:使用foreach 循环 683
23.1.6 延迟执行的查询 683
23.2 使用LINQ 方法语法.683
23.2.1 LINQ 扩展方法 683
23.2.2 查询语法和方法语法 684
23.3 排序查询结果685
23.4 orderby 子句687
23.5 用方法语法排序687
23.6 查询大型数据集689
23.7 聚合运算符.691
23.8 查询复杂的对象694
23.9 投影:在查询中创建新对象698
23.10 投影:方法语法700
23.11 单值选择查询700
23.12 Any和All方法701
23.13 多级排序.703
23.14 多级排序方法语法:ThenBy 705
23.15 组合查询.705
23.16 Take和Skip方法 707
23.17 First和FirstOrDefault方法 709
23.18 LINQ 集运算符 710
23.19 Join 查询 713
23.20 小结 714
23.21 练习 714
23.22 本章要点 715
第24 章 应用LINQ717
24.1 LINQ 的变体 717
24.2 给数据库使用LINQ 718
24.3 安装SQL Server 和Northwind 示例数据 718
24.3.1 安装SQL Server Express .719
24.3.2 安装Northwind 示例数据库719
24.4 第一个LINQ 数据库查询 719
24.5 浏览数据库关系 723
24.6 使用LINQ to XML 725
24.7 LINQ to XML 函数构造方式 725
24.8 保存和加载XML 文档 729
24.8.1 从字符串中加载XML 732
24.8.2 已保存的XML文档内容 732
24.9 处理XML 片段 732
24.10 从数据库中生成XML 734
24.11 查询XML 文档的方法 737
24.12 使用LINQ to XML查询成员 738
24.12.1 Elements 738
24.12.2 Descendants 739
24.12.3 Attributes 741
24.13 小结 743
24.14 练习 743
24.15 本章要点 744
第Ⅴ部分 其 他 技 术
第25 章 Windows Communication Foundation 747
25.1 WCF 的含义748
25.2 WCF 概念748
25.2.1 WCF 通信协议 749
25.2.2 地址、端点和绑定 750
25.2.3 协定 751
25.2.4 消息模式 752
25.2.5 行为 752
25.2.6 驻留 752
25.3 WCF 编程753
25.3.1 WCF 测试客户端程序 759
25.3.2 定义WCF 服务协定 762
25.3.3 自驻留的WCF 服务 769
25.4 小结 776
25.5 练习 776
25.6 本章要点 777
第26 章 Windows Workflow Foundation 779
26.1 Hello World 779
26.2 工作流和活动781
26.2.1 If 活动 781
26.2.2 While 活动 782
26.2.3 Sequence 活动 782
26.3 实参和变量 783
26.4 定制活动 788
26.4.1 工作流扩展 790
26.4.2 活动的有效性验证 795
26.4.3 活动设计器 796
26.5 小结 798
26.6 练习 798
26.7 本章要点 799
附录A 习题答案 801
內容試閱 :
1.1 .NET Framework的含义
.NET Framework现在是版本4.5是Microsoft为开发应用程序而创建的一个具有革命意义的平台。这句话最有趣的地方在于它的广义性,但这是有原因的。首先,注意这句话没有说“在Windows操作系统上开发应用程序”。尽管.NET Framework的Microsoft版本运行在Windows操作系统和Windows Phone操作系统上,但它也有运行在其他操作系统上的版本,例如Mono,它是.NET Framework的开源版本包含C#编译器,该版本可以运行在几个操作系统上,包括各种Linux版本和Mac OS。另外,Mono还有一些版本可以运行在iPhoneMonoTouch和AndroidMono for Android,也称为MonoDroid智能手机上。使用.NET Framework的一个重要原因是它可以作为集成各种操作系统的方式。
另外,上面给出的.NET Framework定义并未限制应用程序的类型。这是因为本来就没有限制。可以使用.NET Framework创建桌面应用程序、Windows Store应用程序、Web应用程序、Web服务和其他各种类型的应用程序。另外注意,对于Web应用程序,按照定义,它们是多平台的应用程序,因为任何带有Web浏览器的系统都可以访问它们。
.NET Framework的设计方式确保它可以用于各种语言,包括本书介绍的C#语言,以及C++、Visual Basic、JScript甚至一些旧语言,如COBOL。为此,还推出了这些语言的.NET版本,目前还在不断推出更多版本。所有这些语言都可以访问.NET Framework,它们彼此之间还可以通信。C#开发人员可以使用Visual Basic程序员编写的代码,反之亦然。
所有这些提供了意想不到的多样性,这也是.NET Framework具有诱人前景的部分原因。
1.1.1 .NET Framework的内容
.NET Framework主要包含一个庞大的代码库,可以在客户语言如C#中通过面向对象编程技术OOP来使用这些代码。这个库分为多个不同的模块,这样就可以根据希望得到的结果来选择使用其中的各个部分。例如,一个模块包含Windows应用程序的构件,另一个模块包含网络编程的代码块,还有一个模块包含Web开发的代码块。一些模块还分为更具体的子模块,例如,在Web开发模块中,有用于建立Web服务的子模块。
其目的是,不同操作系统可以根据各自的特性,支持其中的部分或全部模块。例如,智能手机支持所有的核心.NET功能,但不需要某些更高级的模块。
部分.NET Framework库定义了一些基本类型。类型是数据的一种表达方式,指定最基本类型如32位带符号的整数有助于使用.NET Framework的各种语言之间进行交互操作。这称为通用类型系统Common Type System,CTS。
除提供这个库外,.NET Framework还包含.NET公共语言运行库Common Language Runtime,CLR,它负责管理用.NET库开发的所有应用程序的执行。
1.1.2 使用.NET Framework编写应用程序
使用.NET Framework编写应用程序,就是使用.NET代码库编写代码使用支持Framework的任何一种语言。本书用VS进行开发,VS是一种强大的集成开发环境,支持C#以及托管和非托管C++、Visual Basic和其他一些语言。这个环境的优点是便于把.NET功能集成到代码中。我们创建的代码完全是C#代码,但使用了.NET Framework,并在需要时利用了VS中的其他工具。
为执行C#代码,必须把它们转换为目标操作系统能够理解的语言,即本机代码native code。这种转换称为编译代码,由编译器执行。但在.NET Framework下,此过程包括两个阶段。
1. CIL和JIT
在编译使用.NET Framework库的代码时,不是立即创建专用于操作系统的本机代码,而是把代码编译为通用中间语言Common Intermediate Language,CIL代码,这些代码并非专门用于任何一种操作系统,也非专门用于C#。其他.NET语言,如Visual Basic .NET也会在第一阶段编译为这种语言。开发C#应用程序时,这个编译步骤由VS完成。
显然,要执行应用程序,必须完成更多工作,这是Just-In-TimeJIT编译器的任务,它把CIL编译为专用于OS和目标机器结构的本机代码。这样OS才能执行应用程序。这里编译器的名称Just-In-Time反映了CIL代码仅在需要时才编译的事实。这种编译可以在应用程序的运行过程中动态发生,不过开发人员一般不需要关心这个过程。除非要编写性能十分关键的代码,否则知道这个编译过程会在后台自动进行,并不需要人工干预就可以了。
过去,常常需要把代码编译为几个应用程序,每个应用程序都用于特定的操作系统和CPU结构。这通常是一种优化形式例如,为了让代码在AMD芯片组上运行得更快,有时则是非常重要的例如,使应用程序可以同时工作在Win9x和WinNT2000环境下。现在就不必要了,因为JIT编译器使用CIL代码,而CIL代码是独立于计算机、操作系统和CPU的。目前有几种JIT编译器,每种编译器都用于不同的结构,CIL会使用合适的编译器创建所需的本机代码。
这样,开发人员需要做的工作就比较少了。实际上,可以忽略与系统相关的细节,将注意力集中在代码的功能上就够了。
2. 程序集
在编译应用程序时,所创建的CIL代码存储在一个程序集中。程序集包括可执行的应用程序文件这些文件可以直接在Windows上运行,不需要其他程序,其扩展名是.exe和其他应用程序使用的库其扩展名是.dll。
除包含CIL外,程序集还包含元信息即程序集中包含的数据的信息,也称为元数据和可选的资源CIL使用的其他数据,例如,声音文件和图片。元信息允许程序集是完全自描述的。不需要其他信息就可以使用程序集,也就是说,我们不会遇到没有把需要的数据添加到系统注册表中这样的问题,而这在使用其他平台进行开发时这个问题常常出现。
因此,部署应用程序就非常简单了,只需把文件复制到远程计算机上的目录下即可。因为不需要目标系统上的其他信息,所以只需从该目录中运行可执行文件即可假定安装了.NET CLR。
当然,不必把运行应用程序需要的所有信息都安装到一个地方。可以编写一些代码来执行多个应用程序所要求的任务。此时,通常把这些可重用的代码放在所有应用程序都可以访问的地方。在.NET Framework中,这个地方是全局程序集缓存Global Assembly Cache,GAC,把代码放在这个缓存中是很简单的,只需把包含代码的程序集放在包含该缓存的目录中即可。
3. 托管代码
在将代码编译为CIL,再用JIT编译器将它编译为本机代码后,CLR的任务尚未全部完成,还需要管理正在执行的用.NET Framework编写的代码这个执行代码的阶段通常称为运行时runtime。即CLR管理着应用程序,其方式是管理内存、处理安全性以及允许进行跨语言调试等。相反,不受CLR控制运行的应用程序属于非托管类型,某些语言如C++可以用于编写此类应用程序,例如,访问操作系统的低级功能。但是在C#中,只能编写在托管环境下运行的代码。我们将使用CLR的托管功能,让.NET处理与操作系统的任何交互。
4. 垃圾回收
托管代码最重要的一个功能是垃圾回收garbage collection。这种.NET方法可确保应用程序不再使用某些内存时,就会完全释放这些内存。在.NET推出以前,这项工作主要由程序员负责,代码中的几个简单错误会把大块内存分配到错误的地方,使这些内存神秘失踪。这通常意味着计算机的速度逐渐减慢,最终导致系统崩溃。
.NET垃圾回收会定期检查计算机内存,从中删除不再需要的内容。执行垃圾回收的时间并不固定,可能一秒钟内会进行数千次的检查,也可能几秒钟才检查一次,不过一定会进行检查。
这里要给程序员一些提示。因为在不可预知的时间执行这项工作,所以在设计应用程序时,必须留意这一点。需要许多内存才能运行的代码应自己完成清理工作,而不是坐等垃圾回收,但这不像听起来那样难。
5. 把它们组合在一起
在继续学习之前,先总结一下上述创建.NET应用程序所经历的步骤:
1 使用某种.NET兼容语言如C#编写应用程序代码,如图1-1所示。
2 把代码编译为CIL,存储在程序集中,如图1-2所示。
图 1-1 图 1-2
3 在执行代码时如果这是一个可执行文件,就自动运行,或者在其他代码使用它时运行,首先必须使用JIT编译器将代码编译为本机代码,如图1-3所示。
图 1-3
4 在托管的CLR环境下运行本机代码,以及其他应用程序或进程,如图1-4所示。
图 1-4
6. 链接
在上述过程中还有一点要注意。在第2步中编译为CIL的C#代码未必包含在单独文件中,可以把应用程序代码放在多个源代码文件中,再把它们编译到一个程序集中。这个过程称为链接linking,是非常有用的。原因是处理几个较小的文件比处理一个大文件要简单得多。可以把逻辑上相关的代码分解到一个文件中,以便单独进行处理,这也更便于在需要时找到特定的代码块,让开发小组把编程工作分解为一些可管理的块,让每个人编写一小块代码,而不会破坏已编写好的代码部分或其他人正在处理的部分。
1.2 C#的含义
如上所述,C#是可用于创建要运行在.NET CLR上的应用程序的语言之一,它从C和C++语言演化而来,是Microsoft专门为使用.NET平台而创建的。因为C#是近期发展起来的,所以吸取了以往的教训,考虑了其他语言的许多优点,并解决了它们的问题。
使用C#开发应用程序比使用C++简单,因为其语法更简单。但是,C#是一种强大的语言,在C++中能完成的任务几乎都能利用C#完成。虽然如此,C#中与C++高级功能等价的功能例如直接访问和处理系统内存,只能在标记为“unsafe”的代码中使用。这个高级编程技术存在潜在威胁正如它的名称所暗示的,因为它可能覆盖系统中重要的内存块,导致严重后果。因此,本书不讨论这个问题。
C#代码常比C++略长一些。这是因为C#是一种类型安全的语言与C++不同。在外行人看来,这表示一旦为某个数据指定了类型,就不能转换为另一个不相关的类型。所以,在类型之间转换时,必须遵守严格的规则。执行相同的任务时,用C#编写的代码通常比用C++编写的代码长。但C#代码更健壮,调试起来也比较简单,.NET始终可以随时跟踪数据的类型。在C#中,不能完成诸如“把4字节的内存分配给这个数据后,我们使其有10个字节长,并把它解释为X”等任务,但这并不是一件坏事。
C#只是用于.NET开发的一种语言,但它是最好的一种语言。C#的优点是,它是唯一彻头彻尾为.NET Framework设计的语言,是在移植到其他操作系统上的.NET版本中使用的主要语言。要使诸如VB.NET的语言尽可能类似于其以前的语言,且仍遵循CLR,就不能完全支持.NET代码库的某些功能,至少需要不常见的语法。但C#能使用.NET Framework代码库提供的每种功能。而且,.NET的每个新版本都在C#语言中添加了新功能,满足了开发人员的要求,使之更强大。
1.2.1 用C#能编写什么样的应用程序
如前所述,.NET Framework没有限制应用程序的类型。C#使用的是.NET Framework,所以也没有限制应用程序的类型。这里仅讨论几种常见的应用程序类型。
桌面应用程序 这些应用程序如Microsoft Office具有我们很熟悉的Windows外观和操作方式,使用.NET Framework的Windows Presentation FoundationWPF模块就可以简便地生成这种应用程序。WPF模块是一个控件库,其中的控件例如按钮、工具栏和菜单等可用于建立Windows用户界面UI。
Windows Store应用程序 这是Windows 8中新引入的一类应用程序。此类应用程序主要针对触摸设备设计,通常全屏运行,侧重点在于简洁清晰。创建这类应用程序的方式有多种,包括使用WPF。
Web应用程序 它们是一些Web页面,可以通过任何Web浏览器查看。.NET Framework包括一个动态生成Web内容的强大系统,允许进行个性化和实现安全性等。这个系统称为Active Server Pages .NETASP.NET,我们可以使用C#通过Web Forms 创建ASP.NET应用程序。还可以使用Silverlight编写在浏览器内部运行的应用程序。
WCF服务 这是一种灵活创建各种分布式应用程序的方式。使用WCF服务可以通过局域网或Internet交换几乎各种数据。无论使用什么语言创建WCF服务,也无论WCF服务驻留在什么系统上,都使用一样简单的语法。
这些类型的应用程序也可能需要某种形式的数据库访问,这可以通过.NET Framework的Active Data Objects .NETADO.NET部分、ADO.NET Entity Framework或C#的LINQLanguage Integrated Query功能来实现。也可以使用许多其他资源,例如,创建联网组件、输出图形、执行复杂数学任务的工具。
1.2.2 本书中的C#
本书第Ⅰ部分介绍C# 语言的语法和用法,但不过分强调.NET Framework。这是必需的,因为我们不能没有一点儿C# 编程基础就使用.NET Framework。首先介绍一些比较简单的内容,把较复杂的面向对象编程Object-Oriented Programming,OOP论题放在基础知识的后面论述。假定读者没有一点儿编程的知识,这些是首要的规则。
学习了基础知识后,本书还将介绍如何开发更复杂、更有用的应用程序。本书的第Ⅱ部分将讨论桌面和Windows Store应用程序编程,第Ⅲ部分将研究Web应用程序编程,第Ⅳ部分将讲述数据访问对数据库、文件系统和XML数据的访问和LINQ,第Ⅴ部分将介绍其他一些有趣的.NET论题。
1.3 Visual Studio 2012
本书使用Visual Studio 2012开发工具进行所有的C#编程,包括简单的命令行应用程序,乃至较复杂的项目类型。VS不是开发C#应用程序所必需的开发工具或集成开发环境IDE,但使用它可以使任务更简单一些。如果愿意的话,可在基本的文本编辑器如常见的记事本中处理C#源代码文件,再使用.NET Framework中包含的命令行编译器把代码编译到程序集中。但是,为什么不使用功能完备的IDE呢?
下面列出一些使VS成为.NET开发首选工具的功能。
VS可以自动执行编译源代码的步骤,同时可以完全控制编译过程中使用的任何选项。
VS文本编辑器为VS支持的语言包括C#量身定制,这样就可以智能检测错误,在输入代码时给出合适的推荐代码,这个功能称为IntelliSense。
VS包括XAML、ASP.NET及其他UI语言的设计器,允许UI元素的简单拖放设计。
在C#中,许多类型的项目都可用已有的“样板”代码来创建,不需要从头开始。各种代码文件通常已经准备好了,减少了从头开始一个项目所用的时间。
VS包括几个可自动执行常见任务的向导,其中很多任务可在已有的文件中添加合适的代码,在某些情况下,你甚至不需要考虑语法的正确性。
VS包含许多强大的工具,可以显示项目中的元素并允许在其中导航,这些元素可以是C#源代码文件,也可以是其他资源,例如位图图像或声音文件。
除了在VS中编写应用程序外,还可以创建部署项目,以便为客户提供代码,并使客户方便地完成安装。
在开发项目时,VS允许使用高级调试技巧,例如,能在代码中一次调试一条指令,并监视应用程序的状态。
C#还有许多功能,希望读者能掌握它们!
1.3.1 Visual Studio Express 2012产品
除Visual Studio 2012外,Microsoft还提供了几个更简单的开发工具,称为Visual Studio Express 2012产品。可以在http:www.microsoft.comexpress上免费获得它们。
各种Express产品可以创建所需的几乎所有C#应用程序。在功能上它们都是VS的删节版本,但外观和操作方式是一样的。尽管它们提供了VS的许多功能,但缺少一些重要功能;不过我们仍可以在学习本书的过程中使用它们。
1.3.2 解决方案
在使用VS开发应用程序时,可以通过创建解决方案来完成。在VS术语中,解决方案不仅是一个应用程序,它还包含项目,可以是WPF项目和Web应用程序项目等。但是,解决方案可以包含多个项目,这样,即使相关的代码最终在硬盘上的多个位置编译为多个程序集,也可以把它们组合到一个地方。
这是非常有用的,因为它可以处理“共享”代码这些代码放在GAC中,同时,应用程序也使用这段共享代码。在使用唯一的开发环境时,调试代码是非常容易的,因为可以在多个代码块中单步调试指令。
1.4 小结
本章简要介绍了.NET Framework,并讨论了如何轻松创建各种功能强大的应用程序。还探讨了把用C#等语言编写的代码转换为可运行的应用程序所需要做的工作,以及使用在.NET公共语言运行库下运行的托管代码有什么优点。
本章还阐述了C#的实质,以及它与.NET Framework的关系,描述了进行C#开发时所使用的工具Visual Studio 2012。
第2章将介绍如何运行一些C#代码,介绍基础知识,并集中讨论C#语言本身,而不是过多地讨论IDE的工作原理。