新書推薦:
《
ARM嵌入式Linux系统开发详解(第3版)
》
售價:NT$
595.0
《
长寿时代:做自己人生的CFO
》
售價:NT$
310.0
《
早点知道会幸福的那些事
》
售價:NT$
295.0
《
知宋·宋代之货币
》
售價:NT$
340.0
《
爱的7种对话:建立持续一生的亲密关系 (加)苏·约翰逊
》
售價:NT$
345.0
《
中国近现代武术思想史研究
》
售價:NT$
500.0
《
废奴
》
售價:NT$
350.0
《
有法与无法:清代的州县制度及其运作 最新修订版
》
售價:NT$
640.0
編輯推薦:
在《C#入门经典:更新至C# 9和.NET 5》中,专家级作家Mark J.Price提供了开始编写C#应用程序所需的一切技能,适用于所有主流操作系统。
本书使用当前更流行的Visual Studio Code编辑器开展编程任务,对上一版内容进行了全面的更新和扩展,新增了专门介绍如何使用Blazor构建Web用户界面的章节。
本书分为三大部分。部分介绍C#基础知识,包括面向对象编程和新的C# 9.0语言特性,如程序、面向目标类型的对象实例化以及使用了record关键字的不可变类型。第二部分介绍.NET API,用于执行管理和查询数据、监视和改进性能以及使用文件系统、异步流、序列化和加密等任务。第三部分介绍如何构建和部署跨平台的应用程序,例如使用ASP.NET Core构建Web应用程序和Web服务以及使用Xamarin.Forms构建移动应用程序。
通过学习本书,读者将掌握使用C# 9.0和.NET 5创建网站、服务和移动应用所需的所有技能。
內容簡介:
主要特色
● 使用面向对象编程构建自己的类型
● 使用LINQ查询和操作数据
● 使用ASP.NET Core 5构建网站和服务
● 使用机器学习创建智能应用
● 使用Entity Framework Core和关系数据库
● 使用UWP和XAML开发Windows应用
● 使用Blazor框架构建丰富的Web应用体验
● 使用Xamarin.Forms为iOS和Android开发移动应用
關於作者:
Mark J.Price拥有Microsoft Specialist: Programming in C#、MCSD和MCT等微软编程专家和培训专家认证,拥有20多年的编程和培训经验。自1993年以来,Mark已经通过了80多项微软编程认证,并且擅长帮助他的学生通过这些认证。他的学生中既有经验丰富的编程专家,也有初学编程的中学生。
2001年至2003年,Mark在微软美国总部工作,编写官方教学课件。当C#还处于早期的版本时,他的团队就编写了个C#培训课程。在微软工作期间,Mark负责培训MCT(微软认证讲师),帮助他们以快的速度掌握C#和.NET的新知识。
目錄 :
目 录
第1章 C#与.NET入门 1
1.1 设置开发环境 1
1.1.1 使用Visual Studio Code进行
跨平台开发 1
1.1.2 使用GitHub Codespaces在云中
进行开发 2
1.1.3 使用Visual Studio 2019进行
Windows应用程序开发 3
1.1.4 使用Visual Studio for Mac 进行
移动应用程序开发 3
1.1.5 各章的推荐工具 3
1.1.6 跨平台部署 3
1.1.7 理解Visual Studio Code 版本 4
1.1.8 下载并安装 Visual Studio Code 5
1.1.9 安装其他扩展 5
1.2 理解.NET 6
1.2.1 理解.NET Framework 6
1.2.2 理解Mono 和Xamarin 项目 6
1.2.3 理解.NET Core 7
1.2.4 了解.NET 5的未来版本 7
1.2.5 了解.NET支持 8
1.2.6 .NET Core与.NET 5的区别 10
1.2.7 了解.NET Standard 10
1.2.8 本书使用的.NET平台和工具 11
1.2.9 理解中间语言 12
1.2.10 比较.NET技术 12
1.3 使用Visual Studio Code构建
控制台应用程序 12
1.3.1 使用Visual Studio Code编写代码 12
1.3.2 使用dotnet CLI编译和运行代码 14
1.3.3 编写程序 14
1.4 从GitHub存储库下载解决
方案代码 15
1.4.1 使用Git和Visual Studio Code 15
1.4.2 备份图书解决方案代码存储库 15
1.5 寻求帮助 16
1.5.1 阅读微软文档 16
1.5.2 获取关于dotnet工具的帮助 16
1.5.3 获取类型及其成员的定义 17
1.5.4 在Stack Overflow上寻找答案 18
1.5.5 使用谷歌搜索答案 19
1.5.6 订阅官方的.NET博客 19
1.6 实践和探索 19
1.6.1 练习1.1:测试你掌握的知识 19
1.6.2 练习1.2:在任何地方练习C# 20
1.6.3 练习1.3:探索主题 20
1.7 本章小结 20
第2章 C#编程基础 21
2.1 介绍C# 21
2.1.1 理解语言版本和特性 21
2.1.2 发现C#编译器版本 24
2.1.3 启用特定的语言版本编译器 25
2.2 了解C#基本知识 26
2.2.1 了解C#语法 27
2.2.2 了解C#词汇表 28
2.3 使用变量 32
2.3.1 命名和赋值 32
2.3.2 存储文本 33
2.3.3 存储数字 34
2.3.4 存储布尔值 38
2.3.5 使用Visual Studio Code工作区 38
2.3.6 存储任何类型的对象 38
2.3.7 动态存储类型 39
2.3.8 声明局部变量 40
2.3.9 获取类型的默认值 41
2.3.10 存储多个值 41
2.4 处理空值 42
2.4.1 使值类型可空 42
2.4.2 启用可空引用类型和不可空
引用类型 44
2.4.3 声明不可为空的变量和参数 44
2.4.4 检查null 45
2.5 深入研究控制台应用程序 46
2.5.1 向用户显示输出 46
2.5.2 理解格式字符串 47
2.5.3 从用户那里获取文本输入 48
2.5.4 导入名称空间 48
2.5.5 简化控制台的使用 49
2.5.6 获取用户的重要输入 49
2.5.7 获取参数 50
2.5.8 使用参数设置选项 51
2.5.9 处理不支持API的平台 52
2.6 实践和探索 52
2.6.1 练习2.1:测试你掌握的知识 53
2.6.2 练习2.2:练习数字的大小和范围 53
2.6.3 练习2.3:探索主题 53
2.7 本章小结 54
第3章 控制程序流程和转换类型 55
3.1 操作变量 55
3.1.1 一元运算符 55
3.1.2 二元算术运算符 56
3.1.3 赋值运算符 57
3.1.4 逻辑运算符 57
3.1.5 条件逻辑运算符 58
3.1.6 按位和二元移位运算符 59
3.1.7 其他运算符 60
3.2 理解选择语句 61
3.2.1 使用if语句进行分支 61
3.2.2 if语句为什么应总是使用花括号 62
3.2.3 模式匹配与if语句 62
3.2.4 使用switch语句进行分支 63
3.2.5 模式匹配与switch语句 64
3.2.6 使用switch表达式简化switch
语句 65
3.3 理解迭代语句 66
3.3.1 while循环语句 66
3.3.2 do循环语句 66
3.3.3 for循环语句 67
3.3.4 foreach循环语句 67
3.4 类型转换 68
3.4.1 隐式和显式地转换数值 68
3.4.2 使用System.Convert类型进行
转换 70
3.4.3 圆整数字 70
3.4.4 从任何类型转换为字符串 71
3.4.5 从二进制对象转换为字符串 72
3.4.6 将字符串转换为数值或日期和
时间 73
3.4.7 在转换类型时处理异常 74
3.4.8 检查溢出 76
3.5 实践和探索 78
3.5.1 练习3.1:测试你掌握的知识 79
3.5.2 练习3.2:探索循环和溢出 79
3.5.3 练习3.3:实践循环和运算符 79
3.5.4 练习3.4:实践异常处理 80
3.5.5 练习3.5:测试你对运算符的认识
程度 80
3.5.6 练习3.6:探索主题 80
3.6 本章小结 81
第4章 编写、调试和测试函数 82
4.1 编写函数 82
4.1.1 编写乘法表函数 82
4.1.2 编写带返回值的函数 84
4.1.3 编写数学函数 86
4.1.4 使用XML注释解释函数 89
4.1.5 在函数实现中使用lambda 90
4.2 在开发过程中进行调试 92
4.2.1 创建带有故意错误的代码 92
4.2.2 设置断点 93
4.2.3 使用调试工具栏进行导航 94
4.2.4 调试窗格 94
4.2.5 单步执行代码 95
4.2.6 自定义断点 96
4.3 在开发和运行时进行日志记录 97
4.3.1 使用Debug和Trace类型进行
插装 97
4.3.2 写入默认的跟踪侦听器 98
4.3.3 配置跟踪侦听器 98
4.3.4 切换跟踪级别 99
4.4 单元测试函数 102
4.4.1 创建需要测试的类库 102
4.4.2 编写单元测试 103
4.4.3 运行单元测试 104
4.5 实践和探索 105
4.5.1 练习4.1:测试你掌握的知识 105
4.5.2 练习4.2:使用调试和单元测试
练习函数的编写 105
4.5.3 练习4.3:探索主题 106
4.6 本章小结 106
第5章 使用面向对象编程技术构建
自己的类型 107
5.1 面向对象编程 107
5.2 构建类库 108
5.2.1 创建类库 108
5.2.2 实例化类 110
5.2.3 管理多个文件 111
5.2.4 对象 111
5.3 在字段中存储数据 112
5.3.1 定义字段 112
5.3.2 理解访问修饰符 112
5.3.3 设置和输出字段值 113
5.3.4 使用enum类型存储值 114
5.3.5 使用enum类型存储多个值 115
5.3.6 使用集合存储多个值 116
5.3.7 使字段成为静态字段 117
5.3.8 使字段成为常量 118
5.3.9 使字段只读 118
5.3.10 使用构造函数初始化字段 119
5.3.11 使用默认字面量设置字段 120
5.4 写入和调用方法 121
5.4.1 从方法返回值 121
5.4.2 使用元组组合多个返回值 122
5.4.3 定义参数并将参数传递给方法 124
5.4.4 重载方法 124
5.4.5 传递可选参数和命名参数 125
5.4.6 控制参数的传递方式 126
5.4.7 使用partial关键字分割类 128
5.5 使用属性和索引器控制访问 128
5.5.1 定义只读属性 128
5.5.2 定义可设置的属性 129
5.5.3 定义索引器 130
5.6 模式匹配和对象 131
5.6.1 创建和引用.NET 5类库 131
5.6.2 定义飞机乘客 132
5.6.3 C# 9.0对模式匹配做了增强 133
5.7 使用记录 134
5.7.1 init-only属性 134
5.7.2 理解记录 135
5.7.3 简化数据成员 135
5.7.4 位置记录 136
5.8 实践和探索 136
5.8.1 练习5.1:测试你掌握的知识 137
5.8.2 练习5.2:探索主题 137
5.9 本章小结 137
第6章 实现接口和继承类 138
6.1 建立类库和控制台应用程序 138
6.2 简化方法 140
6.2.1 使用方法实现功能 140
6.2.2 使用运算符实现功能 141
6.2.3 使用局部函数实现功能 142
6.3 触发和处理事件 143
6.3.1 使用委托调用方法 143
6.3.2 定义和处理委托 144
6.3.3 定义和处理事件 145
6.4 实现接口 146
6.4.1 公共接口 146
6.4.2 排序时比较对象 146
6.4.3 使用单独的类比较对象 148
6.4.4 使用默认实现定义接口 149
6.5 使类型可以安全地与泛型
一起重用 151
6.5.1 使用泛型类型 152
6.5.2 使用泛型方法 153
6.6 使用引用类型和值类型管理内存 154
6.6.1 处理struct类型 154
6.6.2 释放非托管资源 155
6.6.3 确保调用Dispose方法 157
6.7 从类继承 158
6.7.1 扩展类 158
6.7.2 隐藏成员 158
6.7.3 覆盖成员 159
6.7.4 防止继承和覆盖 160
6.7.5 理解多态 161
6.8 在继承层次结构中进行
类型转换 162
6.8.1 隐式类型转换 162
6.8.2 显式类型转换 162
6.8.3 避免类型转换异常 163
6.9 继承和扩展.NET类型 164
6.9.1 继承异常 164
6.9.2 无法继承时扩展类型 165
6.10 实践和探索 167
6.10.1 练习6.1:测试你掌握的知识 167
6.10.2 练习6.2:练习创建继承层次
结构 167
6.10.3 练习6.3:探索主题 167
6.11 本章小结 168
第7章 理解和打包.NET类型 169
7.1 .NET 5简介 169
7.1.1 .NET Core 1.0 170
7.1.2 .NET Core 1.1 170
7.1.3 .NET Core 2.0 170
7.1.4 .NET Core 2.1 170
7.1.5 .NET Core 2.2 171
7.1.6 .NET Core 3.0 171
7.1.7 .NET 5 171
7.1.8 从.NET Core 2.0到.NET 5不断
提高性能 172
7.2 了解.NET组件 172
7.2.1 程序集、包和名称空间 173
7.2.2 导入名称空间以使用类型 175
7.2.3 将C#关键字与.NET类型相关联 175
7.2.4 使用.NET Standard类库在旧平台
之间共享代码 177
7.3 发布用于部署的应用程序 178
7.3.1 创建要发布的控制台应用程序 178
7.3.2 dotnet命令 179
7.3.3 发布自包含的应用程序 180
7.3.4 发布单文件应用 181
7.3.5 使用app trimming系统减小应用
程序的大小 182
7.4 反编译程序集 182
7.5 为NuGet分发打包自己的库 185
7.5.1 引用NuGet包 185
7.5.2 为NuGet打包库 186
7.5.3 测试包 188
7.6 从.NET Framework移植到.NET 5 189
7.6.1 能移植吗 189
7.6.2 应该移植吗 190
7.6.3 .NET Framework和.NET 5之间的
区别 190
7.6.4 .NET可移植性分析器 190
7.6.5 使用非.NET Standard类库 190
7.7 实践和探索 192
7.7.1 练习7.1:测试你掌握的知识 192
7.7.2 练习7.2:探索主题 192
7.8 本章小结 193
第8章 使用常见的.NET类型 194
8.1 处理数字 194
8.1.1 处理大的整数 195
8.1.2 处理复数 195
8.2 处理文本 196
8.2.1 获取字符串的长度 196
8.2.2 获取字符串中的字符 196
8.2.3 拆分字符串 196
8.2.4 获取字符串的一部分 197
8.2.5 检查字符串的内容 197
8.2.6 连接、格式化和其他的字符串
成员方法 198
8.2.7 高效地构建字符串 199
8.3 模式匹配与正则表达式 199
8.3.1 检查作为文本输入的数字 199
8.3.2 正则表达式的语法 200
8.3.3 正则表达式的例子 201
8.3.4 分割使用逗号分隔的复杂字符串 201
8.3.5 改进正则表达式的性能 202
8.4 在集合中存储多个对象 203
8.4.1 所有集合的公共特性 203
8.4.2 理解集合的选择 204
8.4.3 使用列表 206
8.4.4 使用字典 207
8.4.5 集合的排序 207
8.4.6 使用专门的集合 208
8.4.7 使用不可变集合 208
8.5 使用Span、索引和范围 209
8.5.1 高效地使用内存 209
8.5.2 用索引类型标识位置 209
8.5.3 使用Range值类型标识范围 209
8.5.4 使用索引和范围 210
8.6 使用网络资源 211
8.6.1 使用URI、DNS和IP地址 211
8.6.2 ping服务器 212
8.7 处理类型和属性 213
8.7.1 程序集的版本控制 213
8.7.2 阅读程序集元数据 214
8.7.3 创建自定义特性 215
8.7.4 更多地使用反射 217
8.8 处理图像 218
8.9 国际化代码 219
8.10 实践和探索 221
8.10.1 练习8.1:测试你掌握的知识 221
8.10.2 练习8.2:练习正则表达式 222
8.10.3 练习8.3:练习编写扩展方法 222
8.10.4 练习8.4:探索主题 222
8.11 本章小结 223
第9章 处理文件、流和序列化 224
9.1 管理文件系统 224
9.1.1 处理跨平台环境和文件系统 224
9.1.2 管理驱动器 225
9.1.3 管理目录 226
9.1.4 管理文件 228
9.1.5 管理路径 229
9.1.6 获取文件信息 230
9.1.7 控制如何处理文件 231
9.2 用流来读写 231
9.2.1 写入文本流 233
9.2.2 写入XML流 234
9.2.3 文件资源的释放 235
9.2.4 压缩流 237
9.2.5 使用Brotli算法进行压缩 238
9.2.6 使用管道的高性能流 240
9.2.7 异步流 240
9.3 编码和解码文本 240
9.3.1 将字符串编码为字节数组 241
9.3.2 对文件中的文本进行编码和解码 243
9.4 序列化对象图 243
9.4.1 序列化为XML 243
9.4.2 生成紧凑的XML 245
9.4.3 反序列化XML文件 246
9.4.4 用JSON序列化格式 246
9.4.5 高性能的JSON处理 248
9.5 实践和探索 249
9.5.1 练习9.1:测试你掌握的知识 249
9.5.2 练习9.2:练习序列化为XML 249
9.5.3 练习9.3:探索主题 250
9.6 本章小结 250
第10章 保护数据和应用程序 251
10.1 理解数据保护术语 251
10.1.1 密钥和密钥的大小 252
10.1.2 IV和块大小 252
10.1.3 salt 252
10.1.4 生成密钥和IV 253
10.2 加密和解密数据 253
10.3 哈希数据 257
10.4 签名数据 260
10.5 生成随机数 263
10.5.1 为游戏生成随机数 263
10.5.2 为密码生成随机数 264
10.6 密码学有什么新内容 264
10.7 用户的身份验证和授权 265
10.7.1 实现身份验证和授权 267
10.7.2 保护应用程序功能 269
10.8 实践和探索 270
10.8.1 练习10.1:测试你掌握的知识 270
10.8.2 练习10.2:练习使用加密和
哈希方法保护数据 270
10.8.3 练习10.3:练习使用解密
保护数据 270
10.8.4 练习10.4:探索主题 270
10.9 本章小结 271
第11章 使用Entity Framework Core
处理数据库 272
11.1 理解现代数据库 272
11.1.1 理解旧的实体框架 272
11.1.2 理解Entity Framework Core 273
11.1.3 使用示例关系数据库 273
11.1.4 为SQLite创建Northwind示例
数据库 275
11.1.5 使用SQLiteStudio管理Northwind
示例数据库 275
11.2 设置EF Core 276
11.2.1 选择EF Core数据提供程序 276
11.2.2 安装dotnet-ef工具 277
11.2.3 连接到数据库 277
11.3 定义EF Core模型 278
11.3.1 EF Core约定 278
11.3.2 EF Core注解特性 278
11.3.3 EF Core Fluent API 279
11.3.4 理解数据播种 280
11.3.5 构建EF Core模型 280
11.4 查询EF Core模型 287
11.4.1 过滤和排序产品 289
11.4.2 记录EF Core 291
11.4.3 使用查询标记进行日志记录 294
11.4.4 模式匹配与Like 294
11.4.5 定义全局过滤器 295
11.5 使用EF Core加载模式 296
11.5.1 立即加载实体 296
11.5.2 启用延迟加载 296
11.5.3 显式加载实体 297
11.6 使用EF Core操作数据 299
11.6.1 插入实体 299
11.6.2 更新实体 300
11.6.3 删除实体 301
11.6.4 池化数据库环境 302
11.6.5 事务 302
11.6.6 定义显式事务 303
11.7 实践和探索 303
11.7.1 练习11.1:测试你掌握的知识 303
11.7.2 练习11.2:练习使用不同的
序列化格式导出数据 304
11.7.3 练习11.3:研究EF Core文档 304
11.8 本章小结 304
第12章 使用LINQ查询和操作数据 305
12.1 编写LINQ查询 305
12.1.1 使用Enumerable类扩展序列 305
12.1.2 使用Where扩展方法过滤实体 306
12.1.3 实体的排序 309
12.1.4 根据类型进行过滤 310
12.2 使用LINQ处理集合 312
12.3 使用LINQ与EF Core 313
12.3.1 序列的筛选和排序 315
12.3.2 将序列投影到新的类型中 316
12.3.3 连接和分组序列 317
12.3.4 聚合序列 320
12.4 使用语法糖美化LINQ语法 320
12.5 使用带有并行LINQ的多个
线程 322
12.6 创建自己的LINQ扩展方法 324
12.7 使用LINQ to XML 327
12.7.1 使用LINQ to XML生成XML 327
12.7.2 使用LINQ to XML读取XML 327
12.8 实践和探索 328
12.8.1 练习12.1:测试你掌握的知识 328
12.8.2 练习12.2:练习使用LINQ
进行查询 329
12.8.3 练习12.3:探索主题 329
12.9 本章小结 329
第13章 使用多任务提高性能和
可伸缩性 330
13.1 理解进程、线程和任务 330
13.2 监控性能和资源使用情况 331
13.2.1 评估类型的效率 331
13.2.2 监控性能和内存使用情况 332
13.2.3 实现Recorder类 332
13.3 异步运行任务 335
13.3.1 同步执行多个操作 336
13.3.2 使用任务异步执行多个操作 337
13.3.3 等待任务 338
13.3.4 继续执行另一项任务 339
13.3.5 嵌套任务和子任务 340
13.4 同步访问共享资源 341
13.4.1 从多个线程访问资源 341
13.4.2 对资源应用互斥锁 342
13.4.3 理解lock语句并避免死锁 343
13.4.4 事件的同步 344
13.4.5 使CPU操作原子化 345
13.4.6 应用其他类型的同步 345
13.5 理解async和await 346
13.5.1 提高控制台应用程序的响应
能力 346
13.5.2 改进GUI应用程序的响应能力 347
13.5.3 改进Web应用程序和Web服务
的可伸缩性 347
13.5.4 支持多任务处理的常见类型 347
13.5.5 在catch块中使用await
关键字 348
13.5.6 使用async流 348
13.6 实践和探索 349
13.6.1 练习13.1:测试你掌握的知识 349
13.6.2 练习13.2:探索主题 349
13.7 本章小结 349
第14章 C#和.NET的实际应用 350
14.1 理解C#和.NET的应用模型 350
14.1.1 使用ASP.NET Core构建网站 350
14.1.2 使用Web内容管理系统
构建网站 351
14.1.3 理解Web应用程序 351
14.1.4 构建和使用Web服务 352
14.1.5 构建智能应用 352
14.2 ASP.NET Core的新特性 352
14.2.1 ASP.NET Core 1.0 352
14.2.2 ASP.NET Core 1.1 352
14.2.3 ASP.NET Core 2.0 353
14.2.4 ASP.NET Core 2.1 353
14.2.5 ASP.NET Core 2.2 353
14.2.6 ASP.NET Core 3.0 354
14.2.7 ASP.NET Core 3.1 354
14.2.8 Blazor WebAssembly 3.2 354
14.2.9 ASP.NET Core 5.0 354
14.3 理解SignalR 355
14.4 理解Blazor 356
14.4.1 JavaScript存在的问题 356
14.4.2 Silverlight 356
14.4.3 WebAssembly 356
14.4.4 服务器端或客户端Blazor 357
14.5 构建Windows桌面应用程序和
跨平台的移动应用程序 357
14.5.1 构建跨平台的移动应用程序 357
14.5.2 使用旧技术构建Windows桌面
应用程序 358
14.6 为Northwind示例数据库构建
实体数据模型 358
14.6.1 为Northwind实体模型创建
类库 358
14.6.2 为Northwind数据库上下文创建
类库 361
14.7 本章小结 363
第15章 使用ASP.NET Core Razor Pages
构建网站 365
15.1 了解Web开发 365
15.1.1 HTTP 365
15.1.2 客户端Web开发 367
15.2 了解ASP.NET Core 368
15.2.1 传统的ASP.NET与现代的
ASP.NET Core 369
15.2.2 创建ASP.NET Core项目 369
15.2.3 测试和保护网站 371
15.2.4 控制托管环境 373
15.2.5 启用静态文件和默认文件 374
15.3 了解Razor Pages 376
15.3.1 启用Razor Pages 376
15.3.2 定义Razor页面 376
15.3.3 通过Razor页面使用共享布局 377
15.3.4 使用后台代码文件与Razor
页面 379
15.4 使用Entity Framework Core与
ASP.NET Core 381
15.4.1 将Entity Framework Core配置为
服务 381
15.4.2 使用Razor页面操作数据 383
15.5 使用Razor类库 384
15.5.1 创建Razor类库 384
15.5.2 禁用压缩文件夹功能 385
15.5.3 在Razor类库中显示员工 386
15.5.4 实现分部视图以显示单个员工 387
15.5.5 使用和测试Razor类库 388
15.5.6 配置服务和HTTP请求管道 389
15.5.7 注册服务 390
15.5.8 配置HTTP请求管道 391
15.5.9 创建一个简单的ASP.NET Core
网站项目 394
15.6 实践和探索 395
15.6.1 练习15.1:测试你掌握的知识 395
15.6.2 练习15.2:练习建立数据驱动的
网页 395
15.6.3 练习15.3:练习为控制台应用
程序构建Web页面 395
15.6.4 练习15.4:探索主题 395
15.7 本章小结 396
第16章 使用MVC模式构建网站 397
16.1 设置ASP.NET Core MVC网站 397
16.1.1 创建和探索ASP.NET Core MVC
网站 397
16.1.2 审查ASP.NET Core MVC网站 399
16.1.3 回顾ASP.NET Core Identity
数据库 401
16.2 探索ASP.NET Core MVC网站 401
16.2.1 了解ASP.NET Core MVC的
启动 401
16.2.2 理解MVC使用的默认路由 403
16.2.3 理解控制器和操作 403
16.2.4 理解视图搜索路径约定 405
16.2.5 单元测试MVC 405
16.2.6 过滤器 405
16.2.7 实体和视图模型 407
16.2.8 视图 408
16.3 自定义ASP.NET Core MVC
网站 410
16.3.1 自定义样式 411
16.3.2 设置类别图像 411
16.3.3 Razor语法 411
16.3.4 定义类型化视图 412
16.3.5 测试自定义首页 414
16.3.6 使用路由值传递参数 415
16.3.7 模型绑定程序 417
16.3.8 验证模型 419
16.3.9 视图辅助方法 422
16.3.10 查询数据库和使用显示模板 422
16.3.11 使用异步任务提高可伸缩性 424
16.4 使用其他项目模板 425
16.5 实践与探索 427
16.5.1 练习16.1:测试你掌握的知识 427
16.5.2 练习16.2:通过实现类别详细
信息页面来练习实现MVC 427
16.5.3 练习16.3:理解和实现异步操作
方法以提高可伸缩性 427
16.5.4 练习16.4:探索主题 427
16.6 本章小结 428
第17章 使用内容管理系统构建网站 429
17.1 了解CMS的优点 429
17.1.1 了解CMS的基本特性 429
17.1.2 了解企业级CMS的特性 430
17.1.3 了解CMS平台 430
17.2 了解Piranha CMS 430
17.2.1 开源库和许可 431
17.2.2 创建Piranha CMS网站 431
17.2.3 探索Piranha CMS网站 432
17.2.4 编辑站点和页面内容 433
17.2.5 创建一个新的页面 436
17.2.6 创建一个新的子页面 437
17.2.7 回顾博客归档 438
17.2.8 文章和页面评论 439
17.2.9 探索身份验证和授权 440
17.2.10 探索配置 441
17.2.11 测试新内容 442
17.2.12 了解路由 442
17.2.13 了解媒体 444
17.2.14 理解应用程序服务 444
17.2.15 理解内容类型 445
17.2.16 理解标准块 449
17.2.17 检查组件类型和标准块 450
17.3 定义组件、内容类型和模板 451
17.3.1 创建自定义区域 452
17.3.2 创建实体数据模型 453
17.3.3 创建自定义页面类型 454
17.3.4 创建自定义视图模型 454
17.3.5 为内容类型自定义内容模板 455
17.3.6 通过配置启动和导入数据库 458
17.3.7 学习如何使用项目模板
创建内容 460
17.4 测试Northwind CMS网站 461
17.4.1 上传图像并创建类别根目录 461
17.4.2 导入类别和产品内容 462
17.4.3 管理类别内容 463
17.4.4 Piranha如何存储内容 464
17.5 实践和探索 465
17.5.1 练习17.1:测试你掌握的知识 465
17.5.2 练习17.2:练习定义块类型,
用以呈现YouTube视频 465
17.5.3 练习17.3:探索主题 466
17.6 本章小结 466
第18章 构建和消费Web服务 467
18.1 使用ASP.NET Core Web API
构建Web服务 467
18.1.1 理解Web服务缩写词 467
18.1.2 创建ASP.NET Core Web API
项目 468
18.1.3 检查Web服务的功能 470
18.1.4 为Northwind示例数据库创建
Web服务 471
18.1.5 为实体创建数据存储库 473
18.1.6 实现Web API控制器 476
18.1.7 配置客户存储库和Web API
控制器 477
18.1.8 指定问题的细节 480
18.1.9 控制XML序列化 481
18.2 解释和测试Web服务 481
18.2.1 使用浏览器测试GET请求 481
18.2.2 使用REST Client扩展测试
HTTP请求 482
18.2.3 启用Swagger 485
18.2.4 使用Swagger UI测试请求 486
18.3 使用HTTP客户端消费服务 490
18.3.1 了解HttpClient类 490
18.3.2 使用HttpClientFactory配置
HTTP客户端 490
18.3.3 在控制器中以JSON的形式
获取客户 491
18.3.4 支持跨源资源共享 493
18.4 实现高级功能 494
18.4.1 实现健康检查API 495
18.4.2 实现Open API分析器和约定 495
18.4.3 实现临时故障处理 496
18.4.4 理解端点路由 496
18.4.5 配置端点路由 496
18.4.6 添加HTTP安全标头 498
18.4.7 保护Web服务 499
18.5 了解其他通信技术 499
18.5.1 了解WCF 499
18.5.2 了解gRPC 500
18.6 实践和探索 500
18.6.1 练习18.1:测试你掌握的知识 500
18.6.2 练习18.2:练习使用HttpClient
创建和删除客户 500
18.6.3 练习18.3:探索主题 500
18.7 本章小结 501
第19章 使用机器学习构建智能
应用程序 502
19.1 了解机器学习 502
19.1.1 了解机器学习的生命周期 502
19.1.2 了解用于训练和测试的数据集 503
19.1.3 了解机器学习任务 503
19.1.4 了解Microsoft Azure Machine
Learning 504
19.2 理解ML.NET 504
19.2.1 了解Infer.NET 505
19.2.2 了解ML.NET学习管道 505
19.2.3 了解模型训练的概念 506
19.2.4 了解缺失值和键类型 506
19.2.5 了解特性和标签 506
19.3 进行产品推荐 507
19.3.1 问题分析 507
19.3.2 数据的收集和处理 507
19.3.3 创建NorthwindML网站项目 508
19.3.4 测试产品推荐网站 519
19.4 实践和探索 521
19.4.1 练习19.1:测试你掌握的知识 521
19.4.2 练习19.2:使用样本进行练习 521
19.4.3 练习19.3:探索主题 521
19.5 本章小结 522
第20章 使用Blazor构建Web用户
界面 523
20.1 理解Blazor 523
20.1.1 理解Blazor托管模型 523
20.1.2 理解Blazor组件 524
20.1.3 比较Blazor和Razor 524
20.1.4 比较Blazor项目模板 524
20.2 使用Blazor服务器构建组件 532
20.2.1 定义和测试简单的组件 532
20.2.2 将实体放入组件 533
20.2.3 为Blazor组件抽象服务 535
20.2.4 使用Blazor表单 537
20.3 使用Blazor WebAssembly
构建组件 542
20.3.1 为Blazor WebAssembly配置
服务器 543
20.3.2 为Blazor WebAssembly配置
客户端 545
20.3.3 Web应用程序的渐进式支持 548
20.4 实践和探索 550
20.4.1 练习20.1:测试你掌握的知识 550
20.4.2 练习20.2:练习创建组件 550
20.4.3 练习20.3:探索主题 550
20.5 本章小结 551
第21章 构建跨平台的移动应用程序 552
21.1 了解XAML 552
21.1.1 使用XAML简化代码 553
21.1.2 选择常见的控件 553
21.1.3 理解标记扩展 554
21.2 了解Xamarin和Xamarin. Forms 554
21.2.1 Xamarin.Forms扩展了Xamarin 554
21.2.2 移动先行,云先行 554
21.2.3 不同移动平台的市场份额 555
21.2.4 了解一些额外功能 555
21.2.5 了解Xamarin.Forms用户界面
组件 556
21.3 使用Xamarin.Forms构建移动
应用程序 557
21.3.1 添加Android SDK 558
21.3.2 创建Xamarin.Forms解决方案 558
21.3.3 创建具有双向数据绑定的
实体模型 559
21.3.4 为拨打电话号码创建组件 562
21.3.5 为客户列表和客户详细信息创建
视图 565
21.3.6 测试移动应用程序 569
21.4 在移动应用程序中消费Web
服务 571
21.4.1 配置Web服务以允许不安全
的请求 572
21.4.2 配置iOS应用程序以允许不安全
的连接 572
21.4.3 配置Android应用程序,允许
进行不安全连接 573
21.4.4 添加用于消费Web服务的
NuGet包 573
21.4.5 从Web服务中获取客户 574
21.5 实践和探索 575
21.5.1 练习21.1:测试你掌握的知识 575
21.5.2 练习21.2:探索主题 576
21.6 本章小结 576
附录部分(请扫描封底二维码获取)
附录A 练习题答案
附录B 构建Windows桌面应用程序
內容試閱 :
译 者 序
C# 9.0已于 2020年 11月 10日正式发布,这一 C#版本的主要落脚点放在数据的简洁性和不可变性方面。C# 9.0的新特性如下:
● init关键字
. 只初始化属性设置器
. init属性访问器和只读字段
● 记录类型
. with表达式
. 基于值的相等
. 继承
. 位置记录
● 程序(Top-Level Program)
● 增强的模式匹配
. 简单类型模式
. 关系模式
● 类型推导的 new表达式
● 返回值类型支持协变
● 本地大小的整型——nint和 nuint
● 静态匿名方法
● 模块初始化器
● 本地函数支持 Attribute
● 扩展的分部方法
● Lambda弃元参数
● 类型推导的条件表达式
● 方法指针
● 禁止发出 localsinit标记
● 扩展了 GetEnumerator以支持 foreach循环
本书内容简洁明快、行文流畅,每个主题都配有实际动手演练项目。本书还是一本循序渐进的指南,可用于通过跨平台的 .NET学习现代 C#实践,书中还简要介绍可以使用它们构建的主要应用程序类型。本书分为 21章,还包含两个附录,内容包括 C#与.NET入门, C#编程基础,控制程序流程和转换类型,编写、调试和测试函数,使用面向对象编程技术构建自己的类型,实现接口和继承类,理解和打包 .NET类型,使用常见的 .NET类型,处理文件、流和序列化,保护数据和应用程序,使用 Entity Framework Core处理数据库,使用 LINQ查询和操作数据,使用多任务提高性能和可伸缩性, C#和.NET的实际应用,使用 ASP.NETCore Razor Pages构建网站,使用 MVC模式构建网站,使用内容管理系统构建网站,构建和消费 Web服务,使用机器学习构建智能应用程序,使用 Blazor构建 Web用户界面以及使用 Xamarin.Forms构建跨平台的移动应用程序。
本书适合 C#和.NET初学者阅读,不要求读者具有任何编程经验;同时也适合使用过 C#但感觉在过去几年自身技术已落伍的程序员;既可供软件项目管理人员、开发团队成员学习参考,也可作为高等院校计算机专业的教材或教学参考用书,甚至可作为通信、电子信息、自动化等相关专业的教材。
在这里要感谢清华大学出版社的编辑,他们为本书的翻译投入了巨大的热情并付出了很多心血。没有他们的帮助和鼓励,本书不可能顺利付梓。
对于这本经典之作,译者本着“诚惶诚恐”的态度,在翻译过程中力求“信、达、雅”,但是由于译者水平有限,失误在所难免,如有任何意见和建议,请不吝指正。
—叶伟民
译 者 介 绍
叶伟民
● 广州.NET俱乐部主席
● 全国各地.NET社区微信群/联系方式名录维护者
● .NET并发编程实战》译者
● .NET内存管理宝典》合译者
● “神机妙算 Fintech信息汇总”公众号号主
● 17年.NET开发经验
● 曾在美国旧金山工作
软件质量需要程序员和测试员一起来保证,书的质量同样如此。十分感谢来自以下.NET社区的试读者:
● 胶东.NET社区——陆楠
● 广州.NET俱乐部、微软 MVP——周豪
● 广州.NET俱乐部、微软 MVP——林德熙
● 广州.NET俱乐部——张陶栋
● 广州.NET俱乐部、微软 Regional Director、微软 MVP ——卢建晖
译者叶伟民拥有全国各地 .NET社区微信群 /联系方式名录,欢迎全国各地 .NET开发者加入所在地区的.NET社区。
作 者 简 介
Mark J. Price是一位拥有 20多年教育和编程经验的微软认证技术专家,他专注于 C#编程以及构建 Azure云解决方案。
自 1993年以来, Mark已经通过了 80多项微软编程考试,他特别擅长传道授业。他的学生既有具有几十年经验的专业人士,也有毫无经验的 16岁学徒。他通过结合教育技能以及亲自为世界范围内的企业提供咨询和开发系统的实际经验,成功指导了所有这些学生。
从 2001年到 2003年,Mark在美国雷德蒙德全职为微软编写官方课件。当 C#还处于 alpha版本时,他的团队就为 C#编写了个培训教程。在微软任职期间,他为“培训师”上课,指导微软认证培训师快速掌握 C#和.NET。
目前, Mark为 Episerver的数字体验平台提供培训课程,包括内容云、商务云和智能云等主题。该平台目前是秀的.NET CMS数字营销和电子商务平台。
2010年,Mark获得了研究生教育证书 (Postgraduate Certificate in Education,PGCE)。他在伦敦两所中学讲授 GCSE和 A-Level数学课程。他拥有计算机科学学士学位,毕业于英国布里斯托尔大学。
审校者简介
Damir Arh拥有多年的软件开发和维护经验,其中包括复杂的企业级软件项目以及现代的面向消费者的移动应用。尽管他使用过各种不同的语言,但他钟爱的语言仍然是 C#。在对更出色的开发过程的不懈追求中,他是测试驱动开发、持续集成和持续部署的忠实支持者。他通过在本地用户组和会议上演讲、撰写博客和文章来分享自己的渊博知识。他曾连续 9次获得微软 MVP称号。在业余时间,他总是喜欢运动,比如徒步旅行、地理探索、跑步和攀岩。
致 谢
感谢我的父母 Pamela和 Ian,是你们把我培养成一个有礼貌、勤奋、对世界充满好奇心的人。感谢我的妹妹 Emily和 Juliet,感谢你们爱我,尽管我有些愚笨。感谢我的朋友和同事们,是你们激发了我的技术潜能和创造力。后,感谢我多年来教过的所有学生,是你们激励我成为出色的老师。
——Mark J. Price
我要感谢我的家人和朋友,在那么多个周末和晚上,正是他们的耐心和理解,才让本书能够更好地为每个人服务。 ——Damir Arh
前 言
有些 C#书籍长达数千页,旨在全面介绍 C#编程语言和.NET Framework。本书与众不同,内容简洁明快、行文流畅,每个主题都配有实际动手演练项目。进行总体叙述的广度是以牺牲一定深度为代价的,但如果愿意,你就会发现许多主题都值得进一步探索。
本书也是一本循序渐进的学习指南,可用于通过跨平台的 .NET学习现代 C#实践,并简要介绍可以使用它们构建的主要应用程序类型。本书适合 C#和.NET初学者阅读,也适合学过 C#但感觉在过去几年自身技术已落伍的程序员阅读。
本书将指出 C#和.NET的一些优缺点,这样就可以给你留下深刻的印象,并快速提高工作效率。本书的解释不会事无巨细,以免因放慢速度导致读者感到无聊,而是假设读者足够聪明,能够自行对一些初、中级程序员需要了解的主题进行解释。
本书内容
第 1章介绍如何设置开发环境,并通过 C#和.NET,使用 Visual Studio Code创建简单的应用程序。通过学习本章,你将了解如何在任何受支持的操作系统 (Windows、macOS和 Linux发布版)中编写和编译代码,对于简化的控制台应用程序,可以使用 C# 9.0中引入的程序功能。本章还介绍了可以从哪里寻求帮助。
第 2章介绍 C#的版本,并通过一些表介绍各个版本的新特性,然后解释 C#日常用来为应用程序编写源代码的语法和词汇。特别是,你在本章将学习如何声明和处理不同类型的变量,以及 C# 8.0中引入可空引用类型后带来的巨大变化。
第 3章讨论如何使用操作符对变量执行简单的操作,包括比较、编写决策, C# 7.0 ~C# 9.0中的模式匹配,以及重复语句块和类型之间的转换。本章还介绍了在不可避免地发生错误时,如何编写防御性代码来处理这些错误。
第 4章讲述如何遵循 Don’t Repeat Yourself (不要重复自己, DRY)原则,使用命令式和函数式风格编写可重用的函数。你将学习使用调试工具来跟踪和删除 bug,在执行代码时监视代码以诊断问题,以及在将代码部署到生产环境之前严格测试代码,以删除 bug并确保稳定性和可靠性。
第 5章讨论类可以拥有的所有不同类别的成员,包括存储数据的字段和执行操作的方法。本章将不可避免地涉及面向对象编程 (Object-Oriented Programming,OOP)概念,如聚合和封装。你将学习一些语言特性,比如元组语法支持和 out变量,默认的字面值和推断出的元组名称。你还将学习如何使用 C# 9.0中引入的 record关键字、init-only属性和 with表达式来定义和使用不可变类型。
第 6章解释如何使用面向对象编程 (OOP)从现有类派生出新的类。你将学习如何定义操作符、本地函数、委托和事件,如何实现关于基类和派生类的接口,如何覆盖类型成员以及使用多态性,如何创建扩展方法,以及如何在继承层次结构中的类之间进行转换。
第 7章介绍 .NET的版本,并给出了一些表来说明哪些版本引入了一些新特性,然后介绍与 .NET Standard兼容的.NET类型以及它们与 C#的关系。你将学习如何部署和打包自己的应用程序和库。
第 8章讨论允许代码执行的实际任务的类型,例如操作数字和文本、在集合中存储对象以及实现国际化。
第 9章讨论与文件系统的交互、对文件和流的读写、文本编码,诸如 JSON和 XML的序列化格式,还涉及改进的功能以及.NET 5中引入的 System.Text.Json类的性能问题。
第 10章探讨如何使用加密方法来保护数据不被恶意用户查看,使用哈希和签名防止数据被操纵或破坏。你将了解如何通过身份验证和授权来保护应用程序免受未授权用户的攻击。
第 11章解释如何使用对象关系映射 (Object Relational Mapping,ORM——技术名称是 Entity Framework Core——来读写数据库,如 Microsoft SQL Server和 SQLite。
第 12章介绍语言集成查询 (LINQ)——LINQ扩展语言增加了处理项目序列、筛选、排序,以及将它们投影到不同输出的能力。
第 13章讨论如何通过允许多个动作同时发生来提高性能、可伸缩性和用户生产率。你将了解 async Main特性以及如何使用 System.Diagnostics名称空间中的类型来监视代码,以度量性能和效率。
第 14章介绍可以使用 C#和.NET构建的跨平台应用程序的类型。本章还将通过构建实体模型来表示 Northwind数据库。Northwind数据库将贯穿使用于本书的第 15~21章。
第 15章介绍在服务器端通过 ASP.NET Core使用现代 HTTP架构构建网站的基础知识。你将学习如何实现 ASP.NET Core特性(称为 Razor页面),从而简化为小型网站创建动态网页以及构建 HTTP请求和响应管道的过程。
第 16章讨论程序员团队如何利用 ASP.NET Core MVC以一种易于进行单元测试和管理的方式构建大型、复杂的网站。你将了解启动配置、身份验证、路由、模型、视图和控制器。
第 17章解释 Web内容管理系统 (Content Management System,CMS)如何使开发人员能够使用可定制的用户界面快速构建网站,非技术用户可以使用这一用户界面创建和管理自己的内容。你将构建一个简单的、基于.NET Core的开源网站,并将之命名为 Piranha CMS。
第 18章解释如何使用 ASP.NET Core Web API构建后端 REST体系结构 Web服务,以及如何使用工厂实例化的 HTTP客户端正确地使用它们。
第 19章介绍 ML.NET开源包中的机器学习算法,这些机器学习算法可用于把自适应智能嵌入任何跨平台的.NET应用程序,比如电子商务网站,从而为游客推荐能够添加到购物车中的商品。
第 20章介绍如何使用 Blazor构建 Web用户界面组件,这些组件既可以在服务器端执行,也可以在客户端的 Web浏览器中执行。本章还将讨论 Blazor Server和 Blazor WebAssembly的区别,以及如何构建能够更容易地在这两种托管模型之间进行切换的组件。
第 21章通过构建跨平台的 iOS和 Android应用程序来介绍 C#移动平台。本章的应用程序可使用 Visual Studio 2019 for Mac在 macOS中进行构建。
附录 A提供了各章练习的解决方案。
附录 B除了介绍 .NET 5及其 Windows桌面包如何使 Windows窗体应用程序和 WPF应用程序在.NET 5上运行时受益之外,还介绍 XAML的基础知识,从而为 Windows Presentation Foundation (WPF)或 Universal Windows Platform (UWP) 图形应用程序定义用户界面。你将能够通过使用 Fluent Design的原则和特性来点亮 UWP应用程序。附录 B中的应用程序只能使用 Windows 10上的 Visual Studio 2019来构建。
要做的准备工作
可在许多平台上使用 Visual Studio Code 开发和部署 C#和.NET应用程序,包括 Windows、macOS和各种 Linux发行版。拥有支持 Visual Studio Code 和互联网连接的操作系统是学习第 1~20章所必
需的。
另外,第 21章需要使用 macOS来构建应用程序,拥有 macOS和 Xcode是编译 iOS应用程序的必要条件。
在线资源
书中的一些截图用彩色效果可能更佳,因为这样有助于你更好地理解输出中的变化。为此,我们专门制作了一份 PDF文件。读者可通过使用手机扫描封底的二维码来下载这份 PDF文件,以及本书的附录、各章练习的解决方案等所有在线资源。