1用C#构建应用快速构建酷炫程序! 2
为什么你要学C# 2
C#和Visual Studio IDE让很多事情变得容易 3
你在Visual Studio中这样做…… 4
Visual Studio会为你这样做…… 4
外星人入侵! 8
只有你能拯救地球 9
以下是你要构建的目标 10
从一个空应用开始 12
为页面建立网格 18
在网格中增加控件 20
使用属性改变控件的外观 22
控件让游戏动起来 24
你已经为游戏做好了准备 29
接下来要做什么 30
增加一个具体做事情的方法 31
为方法填入代码 32
完成方法,运行程序 34
这是你目前为止所做的 36
增加定时器管理游戏 38
让Start按钮起作用 40
运行程序看看进展如何 41
增加代码让控件与玩家交互 42
把人拖到敌人身上,结束游戏 44
现在可以真正玩你的游戏了 45
让敌人看起来更像外星人 46
增加一个启动画面和瓷块 47
发布你的应用 48
使用Remote Debugger越狱应用 49
开始远程调试 50
2都只是代码幕后的故事 54
当你这么做时…… 54
……IDE会这么做 55
程序从哪里来 56
IDE帮你编写代码 58
程序剖析 60
两个类可以在同一个命名空间 65
程序使用变量处理数据 66
C#使用我们熟悉的数学符号 68
使用调试工具查看变量的变化 69
循环就是周而复始反复完成一个动作 71
if/else语句做决策 72
从头开始构建一个应用 73
让各个按钮做些事情 75
建立条件,查看条件是否为true 76
Windows桌面应用很容易构建 87
面向Windows Desktop重构你的应用 88
你的桌面应用知道从哪里开始 92
可以改变程序的入口点 94
在IDE中完成修改,同时也在修改你的代码 96
3对象:我们的方向!让代码更合理 102
Mike如何考虑问题 102
Mike的汽车导航系统如何考虑问题 103
Mike的Navigator类有一些设置和改变路线的方法 104
使用前面所学的知识构建一个使用类的程序 105
Mike有一个好主意 107
Mike可以使用对象来解决他的问题 108
使用类来建立对象 109
由一个类创建新对象时,称为这个类的一个实例 110
更好的解决方案……利用对象! 111
实例使用字段来跟踪状态 116
来创建一些实例! 117
感谢内存 118
程序要做什么 119
使用合适的类名和方法名使代码更直观 120
为类提供一个自然的结构 122
类图可以帮助你组织类,让它们更有意义 124
构建一个类来处理某些人 128
为这些人创建一个工程 129
建立一个窗体与这些人交互 130
还有更容易的方法来初始化对象 133
4类型与引用现在是上午10:00,你知道你的数据在哪里吗? 142
变量的类型决定了它能存储哪种数据 142
变量就像数据外卖杯 144
10磅数据装进5磅的包里 145
即使数字的大小合适,也不能随意赋给任意变量 146
强制转换一个过大的值时,C#会自动调整 147
C#自动完成一些强制类型转换 148
调用一个方法时,实参必须与形参的类型兼容 149
调试里程计算器 153
结合=和操作符 154
对象也使用变量 155
用引用变量指示对象 156
引用就像对象的标签 157
如果没有任何引用,对象就会被垃圾回收 158
多个引用及其副作用 160
两个引用意味着有两个途径来改变一个对象的数据 165
一种特殊情况:数组 166
数组还可以包含一组引用变量 167
欢迎品尝Sloppy Joe餐厅物美价廉的三明治! 168
对象使用引用交谈 170
前人未至之境 171
构建一个打字游戏 176
控件也是对象,与其他对象一样 180
C#实验室1赛狗日 188
规范:构建一个赛狗模拟系统 188
完成的作品 196
5封装让你的隐私……属于你个人 198
Kathleen是一个策划人 198
预算工具要做些什么? 199
你要为Kathleen构建一个程序 200
Kathleen的测试 206
每个选择都应当单独计算 208
很容易无意识地误用对象 210
封装意味着保证类中的一些数据是私有的 211
使用封装控制对类方法和字段的访问 212
但是RealName字段真的得到了保护吗? 213
私有字段和方法只能从类的内部访问 214
封装保证数据干净 222
属性使封装更容易 223
构建一个应用测试Farmer类 224
使用自动属性完成这个类 225
如果想改变单位饲料数呢? 226
使用构造函数初始化私有字段 227
6继承对象的家族树 238
Kathleen也承办生日聚会 238
需要一个BirthdayParty类 239
构建聚会规划工具2.0版 240
还有一个问题……如果人数超过12,聚会能额外收取 247
100吗? 247
类使用继承时,只需要写一次代码 248
建立类模型:从一般到特定 249
如何设计一个动物园模拟系统? 250
使用继承避免子类中出现重复代码 251
不同的动物会发出不同的声音 252
想想如何对动物分组 253
创建类层次结构 254
每个子类都扩展其基类 255
使用冒号继承一个基类 256
我们知道继承会为子类增加基类的字段、属性和方法…… 259
子类可以覆盖方法来改变或替换它继承的方法 260
只要能使用基类,就可以使用它的某个子类 261
子类可以隐藏超类中的方法 268
使用override和virtual关键字来继承行为 270
子类可以使用base关键字访问其基类 272
基类有构造函数,子类也需要有构造函数 273
现在准备完成Kathleen的任务! 274
构建一个蜂巢管理系统 279
如何构建蜂巢管理系统 280
7接口与抽象类让类信守承诺 294
再来看蜂巢问题 294
可以使用继承为不同类型的蜜蜂创建相应的类 295
接口告诉类必须实现某些方法和属性 296
使用interface关键字定义接口 297
现在可以创建两项工作都胜任的NectarStinger实例 298
实现接口的类必须包括接口的所有方法 299
使用接口做个小练习 300
不能实例化接口,不过可以引用接口 302
接口引用类似对象引用 303
可以使用“is”查看一个类是否实现了某个接口 304
接口可以继承其他接口 305
RoboBee 4000可以完成工蜂的工作,而且不需要消耗珍贵的蜂蜜 306
CoffeeMaker也是一个Appliance 308
对象和接口的向上强制转换 309
向下强制转换允许你把家用电器变回咖啡机 310
接口也可以向上和向下强制转换 311
不只是公共和私有 315
访问修饰符改变可见性 316
有些类不能实例化 319
抽象类就像类和接口之间的一个过渡 320
正像我们说的,有些类不能实例化 322
抽象方法没有方法体 323
致命的死亡菱形! 328
多态表示一个对象可以有多种不同形态 331
8枚举与集合存储大量数据 352
字符串并不适于存储所有类型的数据 352
Enum枚举允许处理一组合法值 353
枚举允许用名字表示数字 354
数组很难处理 358
利用List可以很容易地存储……任何事物的集合 359
List比数组更灵活 360
List会动态伸缩 363
泛型可以存储任何类型 364
集合初始化方法类似于对象初始化方法 368
列表很容易,但排序可能很困难 370
IComparable〈Duck〉帮助列表对鸭子排序 371
使用IComparer告诉List如何排序 372
创建比较对象的一个实例 373
IComparer可以完成复杂的比较 374
覆盖ToString()方法让对象自我描述 377
更新foreach循环,让Duck和Card自行显示 378
写foreach循环时,就是在使用IEnumerable〈T〉 379
使用IEnumerable可以向上强制转换整个列表 380
可以建立你自己的重载方法 381
使用字典存储键和值 387
字典功能通览 388
构建一个使用字典的程序 389
还有更多集合类型…… 401
队列是FIFO——先进先出 402
栈是LIFO——后进先出 403
9读写文件为我保存最后一个字节! 410
.NET使用流读写数据 410
不同的流读写不同的数据 411
FileStream向文件读写字节 412
3个简单步骤向文件写文本 413
恶魔Swindler又要发动一个邪恶计划 414
使用两个对象读写 417
数据可以经过多个流 418
使用内置对象弹出标准对话框 421
对话框也是WinForms控件 422
使用内置File和Directory类处理文件和目录 424
使用文件对话框打开和保存文件(只需要几行代码) 427
IDisposable确保适当地撤销对象 429
利用using语句避免文件系统错误 430
使用switch语句做出正确的选择 437
增加一个重载的Deck()构造函数,从文件读入一副牌 439
对象串行化时,它引用的所有对象也要串行化…… 443
利用串行化可以一次读写整个对象图 444
.NET使用Unicode存储字符和文本 449
C#可以使用字节数组移动数据 450
使用Binary Writer写二进制数据 451
还可以手动读写串行化文件 453
找出文件的差别,并使用这些信息修改文件 454
处理二进制文件可能很麻烦 455
使用文件流构建一个十六进制转储工具 456
使用Stream.Read()从流读取字节 458
C#实验室2冒险游戏 466
规范:构建一个冒险游戏 466
好戏就要开始了! 486
10用XAML设计Windows Store应用让你的应用更上一个台阶 488
Brian在运行Windows 8 488
Windows Forms使用IDE建立的一个对象图 494
使用IDE研究对象图 497
Windows Store应用使用XAML创建UI对象 498
把Go Fish!窗体重新设计为一个Windows Store应用页面 500
页面布局从控件开始 502
行和列可以调整来适应页面大小 504
使用网格系统建立应用页面布局 506
数据绑定将XAML页面与类连接起来 512
XAML控件可以包含文本……以及更多 514
使用数据绑定为Sloppy Joe构建一个更棒的菜单 516
使用静态资源在XAML中声明对象 522
使用数据模板显示对象 524
INotifyPropertyChanged允许绑定对象发送更新 526
修改MenuMaker来通知GeneratedDate属性有变化 527
11async、await和数据契约串行化抱歉打断一下 536
Brian的文件遇到点麻烦 536
Windows Store应用使用await来更好地响应 538
使用FileIO类读写文件 540
构建一个不那么简单的文本编辑器 542
数据契约是对象数据的一个抽象定义 547
使用async方法查找和打开文件 548
KnownFolders帮助你访问标准文件夹 550
整个对象图都串行化到XML 551
将Guy对象通过流写入应用的本地文件夹 552
测试你的Guy Serializer应用 556
使用Task从一个async方法调用另一个async方法 557
为Brian构建一个新的借口管理应用 558
分离页面、借口和借口管理系统 559
为借口管理系统创建主页面 560
为主页面增加应用条 561
构建ExcuseManager类 562
增加页面的底层代码 564
12异常处理救火太老套 570
Brian希望他的借口是移动的 570
程序抛出一个异常时,.NET会生成一个Exception对象 574
Brian的代码出了意外 576
所有异常对象都继承了Exception 578
调试工具可以帮助跟踪和避免代码中的异常 579
使用IDE的调试工具找出借口管理系统哪里出了问题 580
哎呀,代码还是有问题…… 583
用try和catch处理异常 585
想调用的方法有风险会发生什么? 586
使用调试工具跟踪try/catch流 588
如果有些代码总要运行,可以使用一个fiinally块 590
使用Exception对象得到问题的有关信息 595
使用多个catch块处理多种类型的异常 596
一个类抛出异常,可以由另一个类中的方法捕获这个异常 597
避免大量问题的一种简便方法:利用using可以免费使用try和fiinally 601
避免异常:实现IDisposable完成自己的清理 602
史上最糟糕的catch块:全能型+注释 604
关于异常处理的一些简单想法 606
13CAPTAIN AMAZING对象之列 618
你的最后机会……对象的最终化方法 618
最终化方法到底什么时候运行? 619
Dispose()处理using,最终化方法处理垃圾回收 620
最终化方法不能依赖于稳定性 622
让对象在Dispose()中自行串行化 623
struct看起来像是一个对象…… 627
……但不是对象 627
值要复制,引用要指定 628
struct是值类型;对象是引用类型 629
栈与堆:再谈谈内存 631
用out参数让方法返回多个值 634
使用ref修饰符按引用传递 635
使用可选参数设置默认值 636
需要不存在的值时可以使用可为空的类型 637
可为空的类型可以让程序更健壮 638
“Captain” Amazing……还不够 641
扩展方法为现有类增加新行为 642
扩展一个基本类型:string 644
14用LINQ查询数据和构建应用掌控你的数据 650
Jimmy是Captain Amazing的忠实粉丝…… 650
……不过他的收藏杂乱无章 651
LINQ可以从多个来源获取数据 652
已经为LINQ建立了.NET集合 653
LINQ使查询很容易 654
LINQ很简单,但是查询不一定简单 655
Jimmy得到一些帮助 658
开始为Jimmy构建一个应用 660
使用new关键字创建匿名类型 663
LINQ是个多面手 666
为Jimmy的应用增加新查询 668
LINQ可以将结果合并分组 673
将Jimmy漫画书的价格分组 674
使用join将两个集合合并到一个序列 677
Jimmy省了一大笔钱 678
使用语义变焦导航数据 684
为Jimmy的应用增加语义变焦 686
你让Jimmy非常高兴 691
IDE的Split App模板可以帮你构建应用导航数据 692
15事件与委托没有监视时,代码在做什么 702
希望你的对象自己考虑问题吗? 702
不过对象怎么知道要做出响应呢? 702
出现一个事件时……对象会监听 703
一个对象产生事件,其他对象监听…… 704
然后,其他对象处理这个事件 705
把各个部分连起来 706
IDE会为你自动创建事件处理方法 710
泛型EventHandler允许你定义自己的事件类型 716
Windows Forms使用多个事件 717
一个事件,多个处理方法 718
Windows Store应用使用事件完成进程生命期管理 720
为Jimmy的漫画书应用增加进程生命期管理 721
XAML控件使用路由事件 724
创建一个应用来研究路由事件 725
连接事件发送者和事件接收者 730
委托代表一个具体的方法 731
委托的实际使用 732
对象可以订购事件…… 735
使用回调控制谁来监听 736
回调只是一种使用委托的方法 738
可以对MessageDialog命令使用回调 740
使用委托利用Windows Setting charm 742
16用 MVVM模式建立应用架构好应用的正反面 746
Head First Basketball Conference篮球联赛需要一个应用 746
不过对于如何构建这个应用他们能达成一致吗? 747
为绑定还是为处理数据而设计? 748
MVVM允许你针对绑定以及数据进行设计 749
使用MVVM模式开始构建篮球赛阵容应用 750
用户控件允许你创建你自己的控件 753
裁判需要一个秒表 761
MVVM意味着要考虑应用的状态 762
开始构建秒表应用的模型 763
事件提醒应用的其余部分有状态发生变化 764
为一个简单的秒表构建视图 765
增加秒表视图模型 766
转换器自动转换值完成绑定 770
转换器可以处理多种不同类型 772
可视化状态使控件对改变做出响应 778
使用DoubleAnimation完成double值动画 779
使用对象动画完成对象值的动画 780
使用同样的视图模型构建一个模拟秒表 781
UI控件也可以用C#代码实例化 786
C#也可以构建“真正的”动画 788
创建一个用户控件来完成图片动画 789
让你的蜜蜂在页面上飞起来 790
使用ItemsPanelTemplate将控件绑定到Canvas 793
祝贺你!(不过还没有结束……) 806
C#实验室3 入侵者 808
经典的视频游戏 808
还有很多可以做 829
17额外奖励的工程!构建一个Windows Phone游戏 832
Bee Attack! 832
开始之前 833
i附录其他:这本书最想介绍的11大内容 846
1.关于Windows Store 846
2.基础知识 848
3.命名空间和程序集 854
4.使用BackgroundWorker保证WinForms的响应性 858
5.Type类和GetType() 861
6.相等性、IEquatable和Equals() 862
7.使用yield return创建可枚举的对象 865
8.重构 868
9.匿名类型、匿名方法和lambda表达式 870
10.LINQ to XML 872
11.Windows表现基础库 874
你知道C#和.NET Framework的这些功能吗? 875