内容简介 · · · · · ·
《深入理解C#(第2版)》是C#领域不可多得的经典著作。作者Jon Skeet在详尽地展示C#各个知识点的同时,更注重从现象中挖掘本质。本书深入探索了C#的核心概念和经典特性,并将这些特性融入到代码中,让读者能够真正领会到C#之“深入”与“精妙”。在第1版的基础上,书中新增了C# 4的新特性,如动态类型、命名实参和可选参数等,这些特性将C#语言提升到了一个新的层次。
《深入理解C#(第2版)》适合中高级.NET开发人员阅读。
作者简介 · · · · · ·
Jon Skeet Google软件工程师,微软资深C# MVP,拥有近10年的C#项目开发经验。他是C#社区和新闻组中非常活跃的技术专家,回答了数以万计的C#和.NET相关问题。他还在个人网站上撰写文 章,阐述C#和.NET最难理解的问题。他还著有另一本畅销书Groovy in Action。
目录 · · · · · ·
第1 章 C#开发的进化史 2
1.1 从简单的数据类型开始 3
1.1.1 C# 1 中定义的产品类型 3
1.1.2 C# 2 中的强类型集合 4
1.1.3 C# 3 中自动实现的属性 5
· · · · · · (更多)
第1 章 C#开发的进化史 2
1.1 从简单的数据类型开始 3
1.1.1 C# 1 中定义的产品类型 3
1.1.2 C# 2 中的强类型集合 4
1.1.3 C# 3 中自动实现的属性 5
1.1.4 C# 4 中的命名实参 6
1.2 排序和过滤 7
1.2.1 按名称对产品进行排序 7
1.2.2 查询集合 10
1.3 处理未知数据 11
1.3.1 表示未知的价格 12
1.3.2 可选参数和默认值 12
1.4 LINQ 简介 13
1.4.1 查询表达式和进程内查询 13
1.4.2 查询XML 14
1.4.3 LINQ to SQL 15
1.5 COM 和动态类型 16
1.5.1 简化COM 互操作 16
1.5.2 与动态语言互操作 17
1.6 剖析.NET 平台 18
1.6.1 C#语言 18
1.6.2 运行时 19
1.6.3 框架库 19
1.7 怎样写出超炫的代码 19
1.7.1 采用代码段形式的全能代码 20
1.7.2 教学代码不是产品代码 21
1.7.3 你的新朋友:语言规范 21
1.8 小结 21
第2 章 C# 1 所搭建的核心基础 23
2.1 委托 23
2.1.1 简单委托的构成 24
2.1.2 合并和删除委托 28
2.1.3 对事件的简单讨论 29
2.1.4 委托小结 30
2.2 类型系统的特征 31
2.2.1 C#在类型系统世界中的位置 31
2.2.2 C# 1 的类型系统在什么时候不够用 34
2.2.3 类型系统特征总结 36
2.3 值类型和引用类型 36
2.3.1 现实世界中的值和引用 36
2.3.2 值类型和引用类型基础知识 37
2.3.3 走出误区 38
2.3.4 装箱和拆箱 40
2.3.5 值类型和引用类型小结 41
2.4 C# 1 之外:构建于坚实基础之上的新特性 41
2.4.1 与委托有关的特性 41
2.4.2 与类型系统有关的特性 43
2.4.3 与值类型有关的特性 45
2.5 小结 46
第二部分 C# 2:解决C# 1 的问题
第3 章 用泛型实现参数化类型 48
3.1 为什么需要泛型 49
3.2 日常使用的简单泛型 50
3.2.1 通过例子来学习:泛型字典 50
3.2.2 泛型类型和类型参数 52
3.2.3 泛型方法和判读泛型声明 55
3.3 深化与提高 58
3.3.1 类型约束 58
3.3.2 泛型方法类型实参的类型推断 62
3.3.3 实现泛型 63
3.4 高级泛型 68
3.4.1 静态字段和静态构造函数 69
3.4.2 JIT 编译器如何处理泛型 70
3.4.3 泛型迭代 72
3.4.4 反射和泛型 74
3.5 泛型在C#和其他语言中的限制 78
3.5.1 泛型可变性的缺乏 78
3.5.2 缺乏操作符约束或者“数值”约束 82
3.5.3 缺乏泛型属性、索引器和其他成员类型 83
3.5.4 同C++模板的对比 84
3.5.5 和Java 泛型的对比 85
3.6 小结 86
第4 章 可空类型 88
4.1 没有值时怎么办 88
4.1.1 为什么值类型的变量不能是null 89
4.1.2 在C# 1 中表示空值的模式 89
4.2 System.Nullable<T>和System.Nullable 91
4.2.1 Nullable<T>简介 91
4.2.2 Nullable<T>装箱和拆箱 94
4.2.3 Nullable<T>实例的相等性 95
4.2.4 来自非泛型Nullable 类的支持 96
4.3 C# 2 为可空类型提供的语法糖 96
4.3.1 ?修饰符 97
4.3.2 使用null 进行赋值和比较 98
4.3.3 可空转换和操作符 99
4.3.4 可空逻辑 102
4.3.5 对可空类型使用as 操作符 103
4.3.6 空合并操作符 104
4.4 可空类型的新奇用法 106
4.4.1 尝试一个不使用输出参数的操作 107
4.4.2 空合并操作符让比较不再痛苦 108
4.5 小结 111
第5 章 进入快速通道的委托 112
5.1 向笨拙的委托语法说拜拜 113
5.2 方法组转换 114
5.3 协变性和逆变性 115
5.3.1 委托参数的逆变性 116
5.3.2 委托返回类型的协变性 117
5.3.3 不兼容的风险 118
5.4 使用匿名方法的内联委托操作 119
5.4.1 从简单的开始:处理一个参数 119
5.4.2 匿名方法的返回值 121
5.4.3 忽略委托参数 123
5.5 在匿名方法中捕捉变量 124
5.5.1 定义闭包和不同的变量类型 124
5.5.2 测试被捕获的变量的行为 126
5.5.3 捕获变量到底有什么用处 127
5.5.4 捕获变量的延长生存期 127
5.5.5 局部变量实例化 128
5.5.6 共享和非共享的变量混合使用 130
5.5.7 捕获变量的使用规则和小结 132
5.6 小结 133
第6 章 实现迭代器的捷径 134
6.1 C# 1:手写迭代器的痛苦 135
6.2 C# 2:利用yield 语句简化迭代器 137
6.2.1 迭代器块和yield return简介 137
6.2.2 观察迭代器的工作流程 139
6.2.3 进一步了解迭代器执行流程 141
6.2.4 具体实现中的奇特之处 144
6.3 真实的例子:迭代范围值 145
6.3.1 迭代时刻表中的日期 145
6.3.2 迭代文件中的行 146
6.3.3 使用迭代器块和谓词对项进行延迟筛选 148
6.4 使用CCR 实现伪同步代码 150
6.5 小结 152
第7 章 结束C# 2 的讲解:最后的一些特性 153
7.1 分部类型 154
7.1.1 在多个文件中创建一个类型 154
7.1.2 分部类型的使用 156
7.1.3 C# 3 独有的分部方法 157
7.2 静态类型 159
7.3 独立的取值方法/赋值方法属性访问器 161
7.4 命名空间别名 162
7.4.1 限定的命名空间别名 163
7.4.2 全局命名空间别名 164
7.4.3 外部别名 164
7.5 Pragma 指令 166
7.5.1 警告pragma 166
7.5.2 校验和pragma 167
7.6 非安全代码中的固定大小的缓冲区 167
7.7 把内部成员暴露给选定的程序集 169
7.7.1 在简单情况下的友元程序集 169
7.7.2 为什么使用InternalsVisibleTo 170
7.7.3 InternalsVisibleTo 和签名程序集 170
7.8 小结 171
第三部分 C# 3:革新写代码的方式
第8 章 用智能的编译器来防错 174
8.1 自动实现的属性 175
8.2 隐式类型的局部变量 176
8.2.1 用var 声明局部变量 177
8.2.2 隐式类型的限制 178
8.2.3 隐式类型的优缺点 179
8.2.4 建议 180
8.3 简化的初始化 180
8.3.1 定义示例类型 181
8.3.2 设置简单属性 182
8.3.3 为嵌入对象设置属性 183
8.3.4 集合初始化列表 184
8.3.5 初始化特性的应用 186
8.4 隐式类型的数组 187
8.5 匿名类型 188
8.5.1 第一次邂逅匿名类型 188
8.5.2 匿名类型的成员 190
8.5.3 投影初始化列表 191
8.5.4 重点何在 192
8.6 小结 193
第9 章 Lambda 表达式和表达式树 194
9.1 作为委托的Lambda 表达式 195
9.1.1 准备工作:Func< >委托类型简介 195
9.1.2 第一次转换成Lambda表达式 196
9.1.3 用单一表达式作为主体 197
9.1.4 隐式类型的参数列表 197
9.1.5 单一参数的快捷语法 198
9.2 使用List<T>和事件的简单例子 199
9.2.1 对列表进行筛选、排序并设置其他操作 199
9.2.2 在事件处理程序中进行记录 201
9.3 表达式树 202
9.3.1 在程序中构建表达式树 202
9.3.2 将表达式树编译成委托 204
9.3.3 将C# Lambda 表达式转换成表达式树 205
9.3.4 位于LINQ 核心的表达式树 208
9.3.5 LINQ 之外的表达式树 209
9.4 类型推断和重载决策发生的改变 211
9.4.1 改变的起因:精简泛型方法调用 211
9.4.2 推断匿名函数的返回类型 212
9.4.3 分两个阶段进行的类型推断 213
9.4.4 选择正确的被重载的方法 217
9.4.5 类型推断和重载决策 218
9.5 小结 219
第10 章 扩展方法 220
10.1 未引入扩展方法之前的状态 221
10.2 扩展方法的语法 223
10.2.1 声明扩展方法 223
10.2.2 调用扩展方法 224
10.2.3 扩展方法是怎样被发现的 225
10.2.4 在空引用上调用方法 226
10.3 . NET 3.5 中的扩展方法 227
10.3.1 从Enumerable 开始起步 228
10.3.2 用Where 筛选并将方法调用链接到一起 229
10.3.3 插曲:似曾相识的Where方法 231
10.3.4 用Select 方法和匿名类型进行投影 232
10.3.5 用OrderBy 方法进行排序 232
10.3.6 涉及链接的实际例子 234
10.4 使用思路和原则 235
10.4.1 “扩展世界”和使接口更丰富 235
10.4.2 流畅接口 236
10.4.3 理智使用扩展方法 237
10.5 小结 238
第11 章 查询表达式和LINQ to Objects 240
11.1 LINQ 介绍 241
11.1.1 LINQ 中的基础概念 241
11.1.2 定义示例数据模型 245
11.2 简单的开始:选择元素 246
11.2.1 以数据源作为开始,以选择作为结束 246
11.2.2 作为查询表达式基础的编译器转换 247
11.2.3 范围变量和重要的投影 249
11.2.4 Cast、OfType 和显式类型的范围变量 251
11.3 对序列进行过滤和排序 252
11.3.1 使用where 子句进行过滤 253
11.3.2 退化的查询表达式 253
11.3.3 使用orderby 子句进行排序 254
11.4 let 子句和透明标识符 256
11.4.1 用let 来进行中间计算 256
11.4.2 透明标识符 257
11.5 联接 258
11.5.1 使用join 子句的内联接 258
11.5.2 使用join into 子句进行分组联接 262
11.5.3 使用多个from 子句进行交叉联接和合并序列 264
11.6 分组和延续 267
11.6.1 使用group by 子句进行分组 267
11.6.2 查询延续 270
11.7 在查询表达式和点标记之间作出选择 272
11.7.1 需要使用点标记的操作 273
11.7.2 选择点标记 273
11.7.3 选择查询表达式 274
11.8 小结 275
第12 章 超越集合的LINQ 276
12.1 使用LINQ to SQL 查询数据库 277
12.1.1 数据库和模型 277
12.1.2 用查询表达式访问数据库 279
12.1.3 包含联接的查询 281
12.2 用IQueryable 和IQueryProvider 进行转换 283
12.2.1 IQueryable<T>和相关接口的介绍 283
12.2.2 模拟接口实现来记录调用 285
12.2.3 把表达式粘合在一起:Queryable 的扩展方法 287
12.2.4 模拟实际运行的查询提供器 289
12.2.5 包装IQueryable 290
12.3 LINQ 友好的API 和LINQ to XML 290
12.3.1 LINQ to XML 中的核心类型 290
12.3.2 声明式构造 292
12.3.3 查询单个节点 294
12.3.4 合并查询操作符 296
12.3.5 与LINQ 和谐共处 297
12.4 用并行LINQ 代替LINQ to Objects 297
12.4.1 在单线程中绘制曼德博罗特集 297
12.4.2 ParallelEnumerable、Parallel-Query 和AsParallel 299
12.4.3 调整并行查询 300
12.5 使用LINQ to Rx 反转查询模型 301
12.5.1 IObservable<T>和IObserver<T> 302
12.5.2 简单地开始 303
12.5.3 查询可观察对象 304
12.5.4 意义何在 306
12.6 扩展LINQ to Objects 306
12.6.1 设计和实现指南 307
12.6.2 示例扩展:选择随机元素 308
12.7 小结 309
第四部分 C# 4:良好的交互性
第13 章 简化代码的微小修改 312
13.1 可选参数和命名实参 312
13.1.1 可选参数 313
13.1.2 命名实参 317
13.1.3 两者相结合 321
13.2 改善COM 互操作性 324
13.2.1 在C# 4 之前操纵Word是十分恐怖的 325
13.2.2 可选参数和命名实参的复仇 325
13.2.3 按值传递ref 参数 326
13.2.4 调用命名索引器 327
13.2.5 链接主互操作程序集 328
13.3 接口和委托的泛型可变性 330
13.3.1 可变性的种类:协变性和逆变性 331
13.3.2 在接口中使用可变性 332
13.3.3 在委托中使用可变性 334
13.3.4 复杂情况 335
13.3.5 限制和说明 336
13.4 对锁和字段风格的事件的微小改变 339
13.4.1 健壮的锁 339
13.4.2 字段风格的事件 340
13.5 小结 341
第14 章 静态语言中的动态绑定 342
14.1 何谓,何时,为何,如何 343
14.1.1 何谓动态类型 343
14.1.2 动态类型什么时候有用,为什么 344
14.1.3 C# 4 如何提供动态类型 345
14.2 关于动态的快速指南 345
14.3 动态类型示例 348
14.3.1 COM 和Office 348
14.3.2 动态语言 350
14.3.3 纯托管代码中的动态类型 353
14.4 幕后原理 358
14.4.1 DLR 简介 358
14.4.2 DLR 核心概念 360
14.4.3 C#编译器如何处理动态 362
14.4.4 更加智能的C#编译器 365
14.4.5 动态代码的约束 368
14.5 实现动态行为 370
14.5.1 使用ExpandoObject 370
14.5.2 使用DynamicObject 374
14.5.3 实现IDynamicMetaObject-Provider 380
14.6 小结 383
第15 章 使用契约让代码更加清晰 385
15.1 未引入代码契约之前的状态 386
15.2 代码契约 387
15.2.1 前置条件 388
15.2.2 后置条件 389
15.2.3 固定条件 390
15.2.4 断言和假设 392
15.2.5 旧式契约 393
15.3 使用ccrewrite 和ccrefgen 重写二进制 394
15.3.1 简单重写 394
15.3.2 契约继承 395
15.3.3 契约引用程序集 398
15.3.4 失败行为 399
15.4 静态检查 401
15.4.1 开始静态检查 401
15.4.2 隐式职责 403
15.4.3 有选择性的检查 406
15.5 使用ccdocgen 将契约文档化 408
15.6 契约实战 410
15.6.1 契约中有什么 410
15.6.2 如何开始 411
15.6.3 无处不在的选项 412
15.7 小结 414
第16 章 何去何从 415
16.1 C#——传统与现代的结合 415
16.2 计算机科学和.NET 416
16.3 计算机世界 417
16.4 再会 417
附录A LINQ 标准查询操作符 419
附录B .NET 中的泛型集合 430
附录C 版本总结 440
· · · · · · (收起)
原文摘录 · · · · · ·
-
当有多个类型参数时,可以用一个适合整个类型含意的单词来分隔它们,例如,我会使用dictionary of string to int来强调映射的部分,而不会使用tuple of string and int。 (查看原文) —— 引自第54页 -
When there are multiple type parameters, I find it makes sense to separate them with a word appropriate to the meaning of the overall type—so I’d talk about a “dictionary of string to int” in order to emphasize the mapping aspect, but a “tuple of string and int.” (查看原文) —— 引自第54页
丛书信息
喜欢读"深入理解C#(第2版)"的人也喜欢的电子书 · · · · · ·
喜欢读"深入理解C#(第2版)"的人也喜欢 · · · · · ·
深入理解C#(第2版)的话题 · · · · · · ( 全部 条 )



深入理解C#(第2版)的书评 · · · · · · ( 全部 18 条 )


C#2.0,3.0 new features book

学习技术较好的一种方式


把体力活留给编译器,把健康留给程序员

原作者语言表达就是一坨屎
> 更多书评 18篇
-
飞林沙 (此账号吐槽的方法已被注释)
搞清楚C#的泛型,一定要弄明白JIT编译器是如何来处理泛型的,然后参照Java的泛型原理,来弄懂为什么说Java的泛型是伪泛型,C#的泛型比Java的泛型好在哪。同样的代码: List<int> list = new List<int>(); list.Add(1); 作用在C#和Java上,性能是否相同,他们的执行过程差在哪里。 了解了这些后,很多人,包括我自己都会弄混一个泛型的概念,.NET为每个值类型生成一套代码,为所有引用类型生成同一套代码,那么这句...2012-01-11 03:03 1人喜欢
搞清楚C#的泛型,一定要弄明白JIT编译器是如何来处理泛型的,然后参照Java的泛型原理,来弄懂为什么说Java的泛型是伪泛型,C#的泛型比Java的泛型好在哪。同样的代码: List<int> list = new List<int>(); list.Add(1); 作用在C#和Java上,性能是否相同,他们的执行过程差在哪里。 了解了这些后,很多人,包括我自己都会弄混一个泛型的概念,.NET为每个值类型生成一套代码,为所有引用类型生成同一套代码,那么这句话与“每个封闭类型都有一个静态字段”这句话是否矛盾。 后来其实想到了一个很容易理解的理由,所有引用类型之间只是代码公用,而数据并不公用,换句话说,他们只是用同一个代码模版而已。 然后回头想Java的泛型究竟差在哪里,Java的泛型采用的是擦除法实现,他为所有的类型都生成了同一套代码模版,而泛型之所以说性能有所提高是因为他能够避免了装箱和拆箱对性能的损耗,而Java的泛型仅仅是在编译层面解决了类型安全的问题,而并没有解决该装箱拆箱的问题(因为生成的都是object类型的模版)。
回应 2012-01-11 03:03 -
飞林沙 (此账号吐槽的方法已被注释)
其实Java程序员的乐趣在于学习一个又一个成熟的框架,然后却只用着SSH,或者SSI来解决几乎所有的问题,读框架源码,然后定制着自己的框架。 但是C#程序员最开心地莫过于跟着微软的步伐体验着C#在进化过程中一个又一个酷炫的语法特性。 C#1.0是一个简陋的语言,说C#1.0 == Java并不为过,而某Java设计者说C#的delegate是一个语言上的退化从今天来看更是成为了笑话。 C#2.0其实只是加入了泛型和匿名方法的概念,C#的泛型完美地改... (3回应)2012-01-09 11:34 1人喜欢
其实Java程序员的乐趣在于学习一个又一个成熟的框架,然后却只用着SSH,或者SSI来解决几乎所有的问题,读框架源码,然后定制着自己的框架。 但是C#程序员最开心地莫过于跟着微软的步伐体验着C#在进化过程中一个又一个酷炫的语法特性。 C#1.0是一个简陋的语言,说C#1.0 == Java并不为过,而某Java设计者说C#的delegate是一个语言上的退化从今天来看更是成为了笑话。 C#2.0其实只是加入了泛型和匿名方法的概念,C#的泛型完美地改善了C++ template和 Java“伪泛型”的缺点,在类型安全的同时也提高了效率和空间的问题。而匿名方法则在委托的基础上加了一层语法糖,有效地减少了类的个数和代码的复杂性。 C#3.0说他万物为LINQ一点也不为过,类型推测 + VS强大的智能感知能力大大提高了程序员的编码效率,而LINQ TO SQL,LINQ TO Object是一个将查询统一化的好典范,而之后社区推出的哪怕是LINQ TO Amazon更是能让我们感觉到微软的野心。Lambda表达式进一步将匿名方法简化,也是C#逐渐动态化的里程碑。 C#4.0 的时代我对.NET接触已经越来越少了,从第一章中能依稀感觉到的特性是C#的进一步动态语言化,包括默认参数,以及DLR的提出允许C#和IronPython, IronRuby的交互成为可能。另外第一章未提及的C#4.0的并行库更是把并行这个程序员都头疼的东西变成了一个傻瓜化的编程方式。 有人说,一旦你真的做过.NET程序员,今后无论你转到什么方向,他都会像你的初恋情人一样,让你终身难忘,并愿意时常回味。
3回应 2012-01-09 11:34
-
飞林沙 (此账号吐槽的方法已被注释)
书中39页:“误区3”:书中的例子举的例子我没懂。 我的理解是:对象默认是通过引用传递这个说法肯定是不对的,引用传递其实准确来说应该是ref,也就是指针的传递。但是C#的传递只是传递了一个地址,我觉得比较合适的一个例子: void AppendHello(StringBuilder sb) { sb = new StringBuiler('aaaaa') } 这样其实相当于把原本sb的地址传了过来,然后当我new操作并赋值的时候,是重新开辟了一块地址并返回,那么在本方法内所使用... (1回应)2012-01-10 19:59
书中39页:“误区3”:书中的例子举的例子我没懂。 我的理解是:对象默认是通过引用传递这个说法肯定是不对的,引用传递其实准确来说应该是ref,也就是指针的传递。但是C#的传递只是传递了一个地址,我觉得比较合适的一个例子: void AppendHello(StringBuilder sb) { sb = new StringBuiler('aaaaa') } 这样其实相当于把原本sb的地址传了过来,然后当我new操作并赋值的时候,是重新开辟了一块地址并返回,那么在本方法内所使用的sb都是新地址的sb。但是从方法参数处传来的引用仍然指向原本的地址,并没有改变。 但是书中举的例子我就不懂了。sb.append的时候,仍然是在原有的对象上来做操作,那么外面的sb应该能感受到sb.Value()的变化。我印象中StringBuiler的成员中是有一个字符数组,然后把空闲位全部都赋值成‘\0’,那么当长度足够用而不需要对sb进行重新分配时,应该时在原有的字符数组中进行修改,所以外面应该时能感受到变化的。 Sorry,我电脑没有.NET的运行环境,所以没办法亲手测试,等待译者的回复 -------------- 译者已回复,上面的观点没问题,可能我对书的意思的理解错了把...应该书上表达的也是类似的意思。
1回应 2012-01-10 19:59
-
空军 (微蓝)
当有多个类型参数时,可以用一个适合整个类型含意的单词来分隔它们,例如,我会使用dictionary of string to int来强调映射的部分,而不会使用tuple of string and int。 其中“不会使用”应改为“对tuple会使用” ,请看原文(这里but不能翻译为“不会”): When there are multiple type parameters, I find it makes sense to separate them with a word appropriate to the meaning of the overall type—so I’d talk about... (1回应)2012-04-14 06:46
当有多个类型参数时,可以用一个适合整个类型含意的单词来分隔它们,例如,我会使用dictionary of string to int来强调映射的部分,而不会使用tuple of string and int。 引自 说明 泛型的发音 其中“不会使用”应改为“对tuple会使用” ,请看原文(这里but不能翻译为“不会”):
When there are multiple type parameters, I find it makes sense to separate them with a word appropriate to the meaning of the overall type—so I’d talk about a “dictionary of string to int” in order to emphasize the mapping aspect, but a “tuple of string and int.” 引自 说明 泛型的发音 1回应 2012-04-14 06:46
论坛 · · · · · ·
11.4讲解let字句的例子或许不合适 | 来自Cath | 2013-03-27 |
在哪儿买这本书 · · · · · ·
-
购买二手书
- 多抓鱼 16.60 元起
- > 查看1家网店价格 (16.60 元起)
在哪儿借这本书 · · · · · ·
这本书的其他版本 · · · · · · ( 全部7 )
- 人民邮电出版社版 2014-4-1 / 101人读过 / 有售
- Manning Publications版 April 21, 2008 / 43人读过
- Manning Publications版 2013-9-27 / 34人读过
- 人民邮电出版社版 2010-5 / 27人读过 / 有售
以下豆列推荐 · · · · · · ( 全部 )
- 程序设计丛书 (志敏荐书)
- 豆瓣9分以上计算机图书 (晚安,本杰明)
- C#与,NET Framework (==)
- Road to PM (罗德曼)
- 程序员必读书单 (White)
谁读这本书?
二手市场
订阅关于深入理解C#(第2版)的评论:
feed: rss 2.0
0 有用 虫虫 2013-06-28
看了前五章,内容还可以,表述太啰嗦
0 有用 Cohlint 2013-04-03
可能功力不够,这本书看起来很吃力,坚持着看完了,好多内容都没有完全消化,功力提升后再看一次
0 有用 Kerie 2013-04-14
一般都是临时用下C#做GUI,看了这本书发现C#真高端,都想认真学习下了
0 有用 moon 2018-07-29
需要相当的编程经验才能顺利读完
0 有用 陈小奈 2013-03-15
好久没读这么棒的讲语言的书了,全是干货
0 有用 moon 2018-07-29
需要相当的编程经验才能顺利读完
0 有用 海洙 2018-07-14
毕业后看过的唯二的专业向书籍之一,反复看过几次,侧重语言特性,感叹作者的简洁优雅,莫名觉得作者是一个温和的胖子,关于封面图的说明很有意思,简直有诗意。后来直接谷歌了吧,这书也就不再问津,及今看到,蒙尘也久,恍如旧梦。一记。
0 有用 蓝色果冻 2018-03-29
C#特性这一点没说到,其他都蛮好的,还有C#的语法糖确实太多了吧
0 有用 liuyu7177 2016-07-12
部分内容有难度,理解起来有困难,还是有深度的一本书。翻译之后读起来不够顺畅,这也是自己英文不好造成的啊。
0 有用 唐·落俗 2016-06-20
虽然很多人clr是圣经,但是我想说这本也是圣经,而且它的讨论点有一些比clr深入。