书籍详情

C#入门经典(第9版)

C#入门经典(第9版)

作者:[德] 本杰明·帕金斯(Benjamin Perkins),乔恩·D. 里德(Jon D. Reid) 著,齐立博 译

出版社:清华大学出版社

出版时间:2022-04-01

ISBN:9787302603030

定价:¥118.00

购买这本书可以去
内容简介
  主要特色讲解变量、表达式、控制流程、函数、调试和错误处理涵盖面向对象编程、类、类成员、ASP.NET Core、WCF、REST API和Blazor App编程技术阐述代码导航、IntelliSense、重构和代码修复等增强功能如何帮助你更快捷、更轻松地编写程序提供大量可下载的示例代码如何在流程早期发现和修复bug,节省时间,减少麻烦 ?探索云计算、跨平台和数据访问编程
作者简介
  Benjamin Perkins, The Best C# Programmer In The World(全球C#程序员),目前在微软(德国慕尼黑)工作,担任Azure团队的升级工程师。Benjamin在IT行业从业超过20年,担任过程序员、系统架构师、技术支持工程师和中层管理人员等。11岁时,Benjamin就开 始在Atari 1200XL台式电脑上用QBasic编写程序。Benjamin 对技术和客户服务富有激情,期待解决问题和开发更多技术解决方案。Benjamin曾说:“ 我在烂熟于心之后才写代码,完整、正确地写一次,这样就不必再考虑它,除非要改进它。" Benjamin已撰写了大量书籍、杂志文章、培训课程,也是一个活跃的博主。
目录
 
 
C#是Microsoft于2002年推出.NET Framework的第1版时提供的一种全新语言。C#从那时起迅速流行开来,成为使用.NET Framework的桌面、Web、云和跨平台开发人员无可争议的选择。开发人员喜欢C#的一个原因是其继承自C/C 的简洁明了的语法,这种语法简化了以前给程序员带来困扰的一些问题。尽管做了这些简化,但C#仍保持了C 原有的功能,所以现在没理由不从C 转向C#。C#语言并不难,也非常适合开发人员学习基本编程技术。易于学习,再加上.NET Framework的功能,使C#成为开始你编程生涯的绝佳方式。
C#的版本C# 9是.NET 5.0和.NET Framework 4.8的一部分,它建立在已有的成功基础之上,还添加了一些更吸引人的功能。Visual Studio的版本Visual Studio和开发工具的Visual Studio Code系列也有许多变化和改进,这大大简化了编程工作,显著提高了效率。
《C#入门经典(第9版)》将全面介绍C#编程的所有知识,从该语言本身一直到桌面编程、云编程和跨平台编程,再到数据源的使用,后是一些新的高级技术。我们还将学习Visual Studio的功能和利用它开发应用程序的各种方式。
《C#入门经典(第9版)》文笔优美流畅,阐述清晰,每一章都以前面章节的内容为基础,便于读者掌握高级技术。每个概念都会根据需要介绍和讨论,而不会突然冒出某个技术术语妨碍读者的阅读和理解。《C#入门经典(第9版)》尽量减少使用的技术术语数量,但如有必要,将根据上下文进行正确的定义和布置。
《C#入门经典(第9版)》作者都是各自领域的专家,都是C#语言和.NET Framework的爱好者,没人比他们更有资格讲授C#了,他们将在你掌握从基本原理到高级技术的过程中为你保驾护航。除基础知识外,《C#入门经典(第9版)》还有许多有益的提示、练习、完全成熟的示例代码(可扫描封底二维码下载),在你的职业生涯中一定会反复用到它们。
《C#入门经典(第9版)》将毫无保留地传授这些知识,希望读者能通过阅读《C#入门经典(第9版)》成为秀的程序员。
0.1  《C#入门经典(第9版)》读者对象
《C#入门经典(第9版)》面向想学习如何使用.NET编写C#程序的所有人。《C#入门经典(第9版)》针对的是想要通过学习一种干净、现代、优雅的编程语言来掌握程序设计的完完全全的初学者。但是,对于熟悉其他编程语言、想要探索.NET平台的读者,以及想要了解旗舰语言.NET的开发人员,《C#入门经典(第9版)》同样很有价值。
0.2  《C#入门经典(第9版)》内容
《C#入门经典(第9版)》前面的章节介绍C#语言本身,读者不需要具备任何编程经验。以前对其他语言有一定了解的开发人员,会觉得这些章节的内容非常熟悉。C#语法的许多方面都与其他语言相同,许多结构对所有的编程语言来说都是相通的(例如,循环和分支结构)。但是,即使是有经验的程序员也可以通过这些章节理解此类技术应用于C#的特征,从而从中获益。
如果读者是编程新手,就应从头开始学习,了解基本的编程概念,并熟悉C#和支持C#的.NET平台。如果读者对.NET 比较陌生,但知道如何编程,就应阅读第1章,然后快速跳读后面几章,这样就能掌握C#语言的应用方式了。如果读者知道如何编程,但以前从未接触过面向对象的编程语言,就应从第8章开始阅读。
如果读者对C#语言比较了解,就可以集中精力学习那些详细论述.NET和C#语言开发的章节,尤其是集合、泛型和C#语言新增内容的相关章节(第11章和第12章)。
《C#入门经典(第9版)》章节的编排方式可以达到两个目的:可以按顺序阅读这些章节,将其视为C#语言的一个完整教程;还可以按照需要深入学习这些章节,将其作为一本参考资料。
除核心内容外,从第3章开始,大多数章节的末尾还包含一组习题,完成这些习题有助于读者理解所学的内容。习题包括简单的选择题、判断题以及需要修改或创建应用程序的较难问题。附录中给出了全部习题的答案。这些习题也可以通过《C#入门经典(第9版)》的配套网站www.wrox.com下载,它们是wrox.com代码下载的一部分。
随着C#和.NET新版本的发布,对每一章都进行了彻底的检查,删掉了不太相关的内容,增加了新内容。所有代码都在版本的开发工具上进行了测试,所有屏幕截图都在Windows操作系统上重新截取,以提供的窗口和对话框。
《C#入门经典(第9版)》的亮点包括:
● 增加并改进了代码示例。
● 增加了编写跨平台运行的ASP.NET Core应用程序的示例。
● 增加了编写云应用程序的示例,并使用Azure SDK创建和访问云资源。
0.3  《C#入门经典(第9版)》结构
《C#入门经典(第9版)》分为3大部分。
● C#语言:介绍C#语言的所有内容,从基础知识到面向对象的技术,一应俱全。
● 数据访问:介绍如何在应用程序中使用数据,包括存储在硬盘文件中的数据、以XML格式存储的数据和数据库中的数据。
● 云和跨平台编程:讲述使用C#和.NET的一些额外方式,包括云和跨平台开发、ASP .NET Web API、Windows Presentation Foundation (WPF)、Windows  Communication Foundation (WCF)和Universal Windows Applications。
下面介绍《C#入门经典(第9版)》3个重要部分中的章节。
0.3.1  C#语言(第1~13章)
第1章介绍C#及其与.NET的关系,了解在这个环境下编程的基础知识,以及Visual Studio与它的关系。
第2章开始介绍如何编写C#应用程序,学习C#的语法,并将C#和示例命令行、Windows应用程序结合起来使用。这些示例将说明如何快速轻松地启动和运行C#,并附带介绍Visual Studio开发环境以及《C#入门经典(第9版)》将要使用的基本窗口和工具。
接着将学习C#语言的基础知识。第3章介绍变量的含义以及如何操纵它们。第4章将用流程控制(循环和分支)改进应用程序的结构,第5章介绍一些更高级的变量类型,如数组。第6章开始以函数形式封装代码,这样就更易于执行重复操作,使代码更容易让人理解。
从第7章将运用C#语言的基础知识,调试应用程序。这包括在运行应用程序时输出跟踪信息,使用Visual Studio查找错误,在强大的调试环境中找出解决问题的办法。
第8章将学习面向对象编程(Object-Oriented Programming,OOP)。首先了解这个术语的含义,回答“什么是对象?”OOP初看起来是较难的问题。我们将用一整章的篇幅来介绍它,解释对象的强大之处。直到该章的后才会真正使用C#代码。
第9章将理论知识应用于实践,当开始在C#应用程序中使用OOP时,这才体现出C#的真正威力。在第9章介绍如何定义类和接口之后,第10章将探讨类成员(包括字段、属性和方法),在该章的后将开始创建一个扑克牌游戏,这个游戏将在后续章节中逐步开发完成,它非常有助于理解OOP。
学习了OOP在C#中的工作原理后,第11章将介绍几种常见的OOP场景,包括处理对象集合、比较和转换对象。第12章讨论.NET 2.0中引入的一个非常有用的C#特性—— 泛型,利用它可以创建非常灵活的类。第13章通过其他一些技术(主要是事件,它在Windows编程中非常重要)继续讨论C#语言和OOP。后介绍C#版本中引入的新特性。
0.3.2  数据访问(第14~17章)
第14章介绍应用程序如何将数据保存到磁盘以及如何检索磁盘上的数据(作为简单的文本文件或者更复杂的数据表示方式)。该章还将讨论如何压缩数据,以及如何监视和处理文件系统的变化。
第15章介绍数据交换的事实标准XML,简要论述JSON格式。该章将讨论XML的基本规则,论述XML的所有功能。
该部分的其余章节介绍LINQ(这是内置于.NET中的查询语言)。第16要介绍LINQ。第17论如何使用LINQ访问数据库和其他数据。
0.3.3  其他技术(第18~21章)
第18章介绍.NET Standard和.NET Core,它们是面向任何应用程序类型(如WPF、Windows和ASP.NET)的工具,新兴的应用程序可以在Linux或macOS等平台上运行。该章讨论.NET标准库的安装、创建和实现指令,还描述了ASP.NET和它的许多不同类型(例如,ASP.NET Webforms、ASP.NET MVC和ASP .NET Core)。
第19章首先描述什么是云编程,并讨论了云优化的堆栈。云环境与传统的程序编码方式不同,因此讨论了一些云编程模式。要完成这一章,需要一个Azure trail账户,它是免费创建的,并附带一些积分,这样就可以创建和测试一个App Service Web应用程序。然后使用Azure SDK和C#,创建并访问ASP .NET Web应用程序中的存储账户。
第20章将学习如何创建ASP.NET Web API,并通过Blazor WebAssembly App使用它。然后,该章介绍了Windows Communication Foundation (WCF),它为在企业级以编程方式跨本地网络和Internet访问信息和功能提供了许多工具。该章将介绍如何以平台无关的方式使用WCF,向Web应用程序和桌面应用程序公开复杂的数据和功能。
第21章首先介绍什么是Windows编程,并看看如何在Visual Studio中实现。将WPF (Windows Presentation Foundation)作为一种工具,以图形化方式构建桌面应用程序,并以少的努力和时间组装高级应用程序。你将从WPF编程的基础知识开始,逐步积累到更高级的概念。
0.4  使用《C#入门经典(第9版)》的要求
《C#入门经典(第9版)》中C#和.NET Framework的代码和描述都适用于C# 9和.NET Framework 4.8。除了.NET之外,不需要其他组件就可以理解《C#入门经典(第9版)》这方面的内容,但书中许多示例都需要使用开发工具。《C#入门经典(第9版)》将Visual Studio Community 2019作为主要开发工具。使用Visual Studio Community 2019来创建Windows应用程序、云应用程序、跨平台的应用程序,以及访问数据库的SQL Server Express应用程序。
可扫描封底二维码下载全书代码。
0.5  《C#入门经典(第9版)》约定
为了帮助读者在阅读《C#入门经典(第9版)》的过程中获取多信息,并随时了解当前处理的事项,《C#入门经典(第9版)》使用了许多约定。
试一试
“试一试”是一个应该跟随书中的文本完成的练习。
1. 这些练习通常包括一组步骤。
2. 每一步都有一个数字。
3. 按照这些步骤走到底。
示例说明
在每个“试一试”之后,会详细解释输入的代码。
警告:
包含重要且应该记住的信息,这些信息与周围的文字直接关联。
注意:
表示注释、提示、暗示、技巧或对当前讨论的弦外之音。
《C#入门经典(第9版)》通过两种方式来显示代码:
● 对于大多数代码示例,使用没有突出显示的等宽字体来表示。
● 对在当前上下文中特别重要的代码,用粗体字强调显示。
0.6  源代码
在读者学习《C#入门经典(第9版)》中的示例时,可以手工输入所有的代码,也可以使用《C#入门经典(第9版)》附带的源代码文件。《C#入门经典(第9版)》使用的所有源代码都可通过扫描封底二维码下载。
大部分代码都以.ZIP、.RAR 或者适合平台的类似归档格式进行了压缩。下载代码后,只需要用合适的解压缩工具对它进行解压缩即可。
 
 
目    录
 
 
第I部分  C#语言
第1章  C#简介   3
1.1  .NET的含义   3
1.1.1  .NET Framework、.NET Standard和
.NET Core   4
1.1.2  使用.NET编写程序   4
1.2  C#的含义   7
1.2.1  用C#能编写什么样的应用程序   8
1.2.2  本书中的C#   8
1.3  Visual Studio   8
1.3.1  Visual Studio产品   9
1.3.2  解决方案   9
1.4  本章要点   9
第2章  编写C#程序   11
2.1  Visual Studio开发环境   12
2.2  控制台应用程序   15
2.2.1  Solution Explorer窗口   17
2.2.2  Properties窗口   18
2.2.3  Error List窗口   18
2.3  桌面应用程序   19
2.4  本章要点   22
第3章  变量和表达式   25
3.1  C#的基本语法   25
3.2  C#控制台应用程序的基本结构   28
3.3  变量   29
3.3.1  简单类型   29
3.3.2  变量的命名   32
3.3.3  字面值   33
3.4  表达式   35
3.4.1  数学运算符   36
3.4.2  赋值运算符   39
3.4.3  运算符的优先级   40
3.4.4  名称空间   40
3.5  习题   42
3.6  本章要点   42
第4章  流程控制   43
4.1  布尔逻辑   43
4.1.1  布尔按位运算符和赋值运算符   45
4.1.2  运算符优先级的更新   46
4.2  分支   47
4.2.1  三元运算符   47
4.2.2  if语句   47
4.2.3  switch语句   51
4.3  循环   53
4.3.1  do循环   53
4.3.2  while循环   56
4.3.3  for循环   57
4.3.4  循环的中断   58
4.3.5  无限循环   59
4.4  习题   59
4.5  本章要点   60
第5章  变量的更多内容   61
5.1  类型转换   61
5.1.1  隐式转换   62
5.1.2  显式转换   63
5.1.3  使用Convert命令进行显式转换   65
5.2  复杂的变量类型   67
5.2.1  枚举   67
5.2.2  结构   71
5.2.3  数组   73
5.3  字符串的处理   83
5.4  习题   87
5.5  本章要点   87
第6章  函数   89
6.1  定义和使用函数   90
6.1.1  返回值   91
6.1.2  参数   93
6.2  变量的作用域   100
6.2.1  其他结构中变量的作用域   103
6.2.2  参数和返回值与全局数据   104
6.2.3  局部函数   106
6.3  Main()函数   106
6.4  结构函数   108
6.5  函数的重载   109
6.6  委托   111
6.7  习题   113
6.8  本章要点   114
第7章  调试和错误处理   115
7.1  Visual Studio中的调试   115
7.1.1  非中断(正常)模式下的调试   116
7.1.2  中断模式下的调试   123
7.2  错误处理   129
7.2.1  try...catch...finally   129
7.2.2  throw表达式   135
7.2.3  列出和配置异常   135
7.3  习题   136
7.4  本章要点   136
第8章  面向对象编程简介   137
8.1  面向对象编程的含义   137
8.1.1  对象的含义   138
8.1.2  一切皆对象   140
8.1.3  对象的生命周期   141
8.1.4  静态成员和实例类成员   141
8.2  OOP技术   142
8.2.1  接口   143
8.2.2  继承   144
8.2.3  多态性   146
8.2.4  对象之间的关系   147
8.2.5  运算符重载   148
8.2.6  事件   149
8.2.7  引用类型和值类型   149
8.3  桌面应用程序中的OOP   150
8.4  习题   153
8.5  本章要点   153
第9章  定义类   155
9.1  C#中的类定义   155
9.2  System.Object   160
9.3  构造函数和析构函数   161
9.4  Visual Studio中的OOP工具   165
9.4.1  Class View窗口   165
9.4.2  对象浏览器   166
9.4.3  添加类   168
9.4.4  类图   169
9.5  类库项目   170
9.6  接口和抽象类   173
9.7  结构类型   175
9.8  浅度和深度复制   176
9.9  习题   177
9.10  本章要点   177
第10章  定义类成员   179
10.1  成员定义   179
10.1.1  定义字段   180
10.1.2  定义方法   180
10.1.3  定义属性   181
10.1.4  元组析构   186
10.1.5  重构成员   186
10.1.6  自动属性   187
10.2  类成员的其他主题   188
10.2.1  隐藏基类方法   188
10.2.2  调用重写或隐藏的基类方法   189
10.2.3  使用嵌套的类型定义   190
10.3  接口的实现   192
10.4  部分类定义   194
10.5  部分方法定义   195
10.6  示例应用程序   197
10.6.1  规划应用程序   197
10.6.2  编写类库   197
10.6.3  类库的客户应用程序   203
10.7  Call Hierarchy窗口   204
10.8  习题   205
10.9  本章要点   205
第11章  集合、比较和转换   207
11.1  集合   207
11.1.1  使用集合   208
11.1.2  定义集合   213
11.1.3  索引符   214
11.1.4  给CardLib添加Cards集合   216
11.1.5  键控集合和IDictionary   218
11.1.6  迭代器   219
11.1.7  迭代器和集合   223
11.1.8  深度复制   223
11.1.9  给CardLib添加深度复制   225
11.2  比较   226
11.2.1  类型比较   226
11.2.2  使用is运算符模式表达式
进行模式匹配   230
11.2.3  值比较   231
11.3  转换   244
11.3.1  重载转换运算符   244
11.3.2  as运算符   245
11.4  习题   246
11.5  本章要点   247
第12章  泛型   249
12.1  泛型的含义   249
12.2  使用泛型   250
12.2.1  可空类型   251
12.2.2  System.Collections.Generic
名称空间   257
12.3  定义泛型类型   266
12.3.1  定义泛型类   266
12.3.2  定义泛型接口   275
12.3.3  定义泛型方法   275
12.3.4  定义泛型委托   277
12.4  变体   277
12.4.1  协变   278
12.4.2  抗变   278
12.5  习题   279
12.6  本章要点   280
第13章  高级C#技术   281
13.1  ::运算符和全局名称空间
限定符   282
13.2  定制异常   283
13.3  事件   284
13.3.1  事件的含义   284
13.3.2  处理事件   286
13.3.3  定义事件   288
13.4  扩展和使用CardLib   295
13.5  特性   302
13.5.1  读取特性   302
13.5.2  创建特性   303
13.6  初始化器   304
13.6.1  对象初始化器   304
13.6.2  集合初始化器   306
13.7  类型推理   309
13.8  匿名类型   310
13.9  动态查找   314
13.10  高级方法参数   317
13.10.1  可选参数   318
13.10.2  命名参数   319
13.11  Lambda表达式   323
13.11.1  复习匿名方法   323
13.11.2  把Lambda表达式用于
匿名方法   324
13.11.3  Lambda表达式的参数   327
13.11.4  Lambda表达式的语句体   327
13.11.5  Lambda表达式用作委托和
表达式树   328
13.11.6  Lambda表达式和集合   329
13.12  习题   331
13.13  本章要点   332
第II部分  数据访问
第14章  文件   337
14.1  用于输入和输出的类   337
14.1.1  File类和Directory类   338
14.1.2  FileInfo类   339
14.1.3  DirectoryInfo类   340
14.1.4  路径名和相对路径   341
14.2  流   341
14.2.1  使用流的类   341
14.2.2  FileStream对象   342
14.2.3  StreamWriter对象   347
14.2.4  StreamReader对象   349
14.2.5  异步文件访问   351
14.2.6  读写压缩文件   352
14.3  监控文件系统   355
14.4  习题   359
14.5  本章要点   359
第15章  XML和JSON   361
15.1  XML基础   361
15.2  JSON 基础   362
15.3  XML模式   363
15.4  XML文档对象模型   365
15.4.1  XmlDocument类   365
15.4.2  XmlElement类   366
15.4.3  修改节点的值   369
15.5  用XPath搜索XML   374
15.6  习题   380
15.7  本章要点   381
第16章  LINQ   383
16.1  LINQ to XML   384
16.1.1  LINQ to XML函数构造方式   384
16.1.2  处理XML片段   387
16.2  LINQ提供程序   389
16.3  LINQ查询语法   389
16.3.1  用var关键字声明结果变量   390
16.3.2  指定数据源:from子句   391
16.3.3  指定条件:where子句   391
16.3.4  选择元素:select子句   391
16.3.5  完成:使用foreach循环   392
16.3.6  延迟执行的查询   392
16.4  LINQ方法语法   392
16.4.1  LINQ扩展方法   392
16.4.2  查询语法和方法语法   392
16.4.3  Lambda 表达式   393
16.5  排序查询结果   395
16.6  orderby子句   396
16.7  查询大型数据集   396
16.8  使用聚合运算符   399
16.9  单值选择查询   401
16.10  多级排序   404
16.11  分组查询   405
16.12  join查询   407
16.13  习题   408
16.14  本章要点   409
第17章  数据库   411
17.1  使用数据库   411
17.2  Entity Framework   412
17.3  代码优先与数据库优先   412
17.4  迁移和搭框架   412
17.5  安装SQL Server Express 
LocalDB   412
17.6  代码优先数据库   413
17.7  数据库的位置   423
17.8  导航数据库关系   424
17.9  在已有的数据库中创建和
查询XML   430
17.10  习题   433
17.11  本章要点   434
第III部分  云和跨平台编程
第18章  .NET与ASP.NET   437
18.1  跨平台基础知识以及必知的
关键术语   438
18.2  .NET Standard的含义   440
18.2.1  共享项目、PCL和
.NET Standard   441
18.2.2  构建和打包.NET Standard库   443
18.3  引用和目标.NET   446
18.4  .NET Core的含义   447
18.4.1  跨平台   447
18.4.2  开源   448
18.4.3  针对云进行优化   448
18.4.4  性能   448
18.4.5  模块化设计   449
18.4.6  独立的部署模型   450
18.5  从.NET Framework移植
到.NET   452
18.5.1  识别第三方依赖   453
18.5.2  理解哪些功能不可用   454
18.5.3  升级当前的.NET Framework
目标   454
18.6  Web应用程序概述   454
18.7  选择合适的ASP.NET   455
18.7.1  ASP.NET Web Forms   456
18.7.2  ASP.NET MVC/ASP.NET 
Core Web App MVC   461
18.7.3  ASP.NET Web API   463
18.7.4  ASP.NET Core Web App   463
18.8  本章要点   469
第19章  基本的云编程   471
19.1  云、云计算和云优化堆栈   472
19.2  云模式和实践   474
19.3  使用Microsoft Azure C#库
创建存储容器   475
19.4  创建使用存储容器的ASP.NET 
Core Web应用程序   483
19.5  习题   488
19.6  本章要点   489
第20章  基本Web API和WCF编程   491
20.1  创建ASP.NET Core Web API   491
20.2  使用ASP.NET Core Web API   495
20.3  REST的含义   501
20.4  WCF的含义   501
20.5  WCF概念   502
20.5.1  WCF通信协议   502
20.5.2  地址、端点和绑定   503
20.5.3  协定   504
20.5.4  消息模式   505
20.5.5  行为   505
20.5.6  驻留   505
20.6  WCF编程   505
20.6.1  WCF测试客户端程序   511
20.6.2  定义WCF服务协定   513
20.6.3  自驻留的WCF服务   519
20.7  习题   525
20.8  本章要点   526
第21章  基本桌面编程   527
21.1  XAML   528
21.1.1  关注点分离   528
21.1.2  XAML基础知识   529
21.2  动手实践   530
21.2.1  WPF控件   531
21.2.2  属性   532
21.2.3  事件   535
21.3  控件布局   540
21.3.1  基本布局概念   540
21.3.2  布局面板   541
21.4  游戏客户端   549
21.4.1  About窗口   549
21.4.2  Options窗口   553
21.4.3  数据绑定   562
21.4.4  使用ListBox控件启动游戏   566
21.5  创建控件并设置样式   569
21.5.1  样式   570
21.5.2  模板   570
21.5.3  触发器   572
21.5.4  动画   573
21.6  WPF用户控件   574
21.7  主窗口   586
21.7.1  菜单控件   586
21.7.2  路由命令和菜单   586
21.8  把所有内容结合起来   590
21.8.1  重构域模型   590
21.8.2  视图模型   597
21.8.3  大功告成   604
21.9  习题   611
21.10  本章要点   612
附录A  习题答案(可从配套网站下载)
 
 
猜您喜欢

读书导航