计算机
类型
可以朗读
语音朗读
651千字
字数
2022-03-01
发行日期
展开全部
主编推荐语
本书探讨了一些较为复杂的编程思想,并深入讨论了语言较新版本(C# 8.0和.NET Framework 4.8/.NET Core 3.1)的新功能。
内容简介
作为历年来深受各层次开发人员欢迎的C#指南,本书讨论了从C#3.0到8.0的重要的C#特性,强调了现代编程模式,可帮助读者编写简洁、强大、健壮、安全和易于维护的C#代码。
C#专家马克·米凯利斯对语言进行了全面而深入的探讨,提供了对关键C#8.0增强、C# 8.0和.NET Core/.NET Standard的配合使用以及跨平台编译的专业论述。他用简洁的例子阐释了关键C#构造,并提供了大量实践编程规范,为你进行高效软件开发打好基础。
目录
- 版权信息
- 译者序
- 序言
- 前言
- 致谢
- 作者简介
- 第1章 C#概述
- 1.1 Hello, World
- 1.1.1 创建、编辑、编译和运行C#源代码
- 1.1.2 创建项目
- 1.1.3 编译和执行
- 1.1.4 使用本书源代码
- 1.2 C#语法基础
- 1.2.1 C# 关键字
- 1.2.2 标识符
- 1.2.3 类型定义
- 1.2.4 Main方法
- 1.2.5 语句和语句分隔符
- 1.2.6 空白
- 1.3 使用变量
- 1.3.1 数据类型
- 1.3.2 变量的声明
- 1.3.3 变量的赋值
- 1.3.4 变量的使用
- 1.4 控制台输入和输出
- 1.4.1 从控制台获取输入
- 1.4.2 将输出写入控制台
- 1.4.3 注释
- 1.5 托管执行和CLI
- CIL和ILDASM
- 1.6 多个.NET框架
- 1.6.1 应用程序编程接口
- 1.6.2 C#和.NET版本控制
- 1.6.3 .NET Standard
- 1.7 小结
- 第2章 数据类型
- 2.1 基本数值类型
- 2.1.1 整数类型
- 2.1.2 浮点类型
- 2.1.3 decimal类型
- 2.1.4 字面值
- 2.2 更多基本类型
- 2.2.1 布尔类型
- 2.2.2 字符类型
- 2.2.3 字符串
- 2.2.4 null和void
- 2.3 数据类型转换
- 2.3.1 显式转型
- 2.3.2 隐式转型
- 2.3.3 不使用转型操作符的类型转换
- 2.4 小结
- 第3章 更多数据类型
- 3.1 类型的划分
- 3.1.1 值类型
- 3.1.2 引用类型
- 3.2 将变量声明为可空
- 3.2.1 对null值引用类型变量进行解引用
- 3.2.2 可空值类型
- 3.2.3 可空引用类型
- 3.3 隐式类型的局部变量
- 3.4 元组
- 3.5 数组
- 3.5.1 数组的声明
- 3.5.2 数组实例化和赋值
- 3.5.3 数组的使用
- 3.5.4 字符串作为数组使用
- 3.5.5 常见数组错误
- 3.6 小结
- 第4章 操作符和控制流程
- 4.1 操作符
- 4.1.1 一元正负操作符
- 4.1.2 二元算术操作符
- 4.1.3 复合赋值操作符
- 4.1.4 递增和递减操作符
- 4.1.5 常量表达式和常量符号
- 4.2 控制流程概述
- 4.2.1 if语句
- 4.2.2 嵌套if
- 4.3 代码块
- 4.4 代码块、作用域和声明空间
- 4.5 布尔表达式
- 4.5.1 关系操作符和相等操作符
- 4.5.2 逻辑操作符
- 4.5.3 逻辑求反操作符
- 4.5.4 条件操作符
- 4.6 关于null的编程
- 4.6.1 检查null值
- 4.6.2 空合并操作符与空合并赋值操作符
- 4.6.3 空条件操作符
- 4.6.4 空包容操作符
- 4.7 按位操作符
- 4.7.1 移位操作符
- 4.7.2 按位操作符
- 4.7.3 按位复合赋值操作符
- 4.7.4 按位取反操作符
- 4.8 控制流程语句
- 4.8.1 while和do/while循环
- 4.8.2 for循环
- 4.8.3 foreach循环
- 4.8.4 基本switch语句
- 4.9 跳转语句
- 4.9.1 break语句
- 4.9.2 continue语句
- 4.9.3 goto语句
- 4.10 C#预处理器指令
- 4.10.1 排除和包含代码
- 4.10.2 定义预处理器符号
- 4.10.3 生成错误和警告
- 4.10.4 关闭警告消息
- 4.10.5 nowarn:<warn list>选项
- 4.10.6 指定行号
- 4.10.7 可视编辑器提示
- 4.10.8 启用可空引用类型
- 4.11 小结
- 第5章 方法和参数
- 5.1 方法的调用
- 5.1.1 命名空间
- 5.1.2 类型名称
- 5.1.3 作用域
- 5.1.4 方法名称
- 5.1.5 形参和实参
- 5.1.6 方法返回值
- 5.1.7 对比语句和方法调用
- 5.2 方法的声明
- 5.2.1 参数声明
- 5.2.2 方法返回类型声明
- 5.2.3 表达式主体方法
- 5.3 using指令
- 5.3.1 using static指令
- 5.3.2 使用别名
- 5.4 Main()的返回值和参数
- 5.5 高级方法参数
- 5.5.1 值参数
- 5.5.2 引用参数
- 5.5.3 输出参数
- 5.5.4 只读传引用
- 5.5.5 返回引用
- 5.5.6 参数数组
- 5.6 递归
- 5.7 方法重载
- 5.8 可选参数
- 5.9 用异常实现基本错误处理
- 5.9.1 捕捉错误
- 5.9.2 使用throw语句报告错误
- 5.10 小结
- 第6章 类
- 6.1 类的声明和实例化
- 6.2 实例字段
- 6.2.1 声明实例字段
- 6.2.2 访问实例字段
- 6.3 实例方法
- 6.4 使用this关键字
- 存储和载入文件
- 6.5 访问修饰符
- 6.6 属性
- 6.6.1 声明属性
- 6.6.2 自动实现的属性
- 6.6.3 属性和字段的设计规范
- 6.6.4 提供属性验证
- 6.6.5 只读和只写属性
- 6.6.6 属性作为虚字段
- 6.6.7 取值和赋值方法的访问修饰符
- 6.6.8 属性和方法调用不允许作为ref或out参数值
- 6.7 构造函数
- 6.7.1 声明构造函数
- 6.7.2 默认构造函数
- 6.7.3 对象初始化器
- 6.7.4 重载构造函数
- 6.7.5 构造函数链:使用this调用另一个构造函数
- 6.8 不可空引用类型属性与构造函数
- 6.8.1 可读写的引用型不可空属性
- 6.8.2 自动实现的只读引用型属性
- 6.9 可空特性
- 6.10 解构函数
- 6.11 静态成员
- 6.11.1 静态字段
- 6.11.2 静态方法
- 6.11.3 静态构造函数
- 6.11.4 静态属性
- 6.11.5 静态类
- 6.12 扩展方法
- 6.13 封装数据
- 6.13.1 const
- 6.13.2 readonly
- 6.14 嵌套类
- 6.15 分部类
- 6.15.1 定义分部类
- 6.15.2 分部方法
- 6.16 小结
- 第7章 继承
- 7.1 派生
- 7.1.1 基类型和派生类型之间的转型
- 7.1.2 private访问修饰符
- 7.1.3 protected访问修饰符
- 7.1.4 扩展方法
- 7.1.5 单继承
- 7.1.6 密封类
- 7.2 重写基类
- 7.2.1 virtual修饰符
- 7.2.2 new修饰符
- 7.2.3 sealed修饰符
- 7.2.4 base成员
- 7.2.5 调用基类的构造函数
- 7.3 抽象类
- 7.4 所有类都从System.Object派生
- 7.5 用is操作符进行模式匹配
- 7.5.1 使用is操作符验证基础类型
- 7.5.2 type、var和const的模式匹配
- 7.5.3 元组模式匹配
- 7.5.4 顺序模式匹配
- 7.5.5 属性模式匹配
- 7.5.6 递归模式匹配
- 7.6 switch语句中的模式匹配
- 7.7 避免对多态类对象使用模式匹配
- 7.8 小结
- 第8章 接口
- 8.1 接口概述
- 8.2 通过接口实现多态性
- 8.3 接口实现
- 8.3.1 显式成员实现
- 8.3.2 隐式成员实现
- 8.3.3 显式与隐式接口实现的比较
- 8.4 在实现类和接口之间转换
- 8.5 接口继承
- 8.6 多接口继承
- 8.7 接口上的扩展方法
- 8.8 版本升级
- 8.8.1 C# 8.0之前的接口版本升级
- 8.8.2 C# 8.0之后的接口版本升级
- 8.8.3 基于保护访问成员实现额外的封装和多态
- 8.9 扩展方法与默认接口成员
- 8.10 比较接口和抽象类
- 8.11 比较接口和特性
- 8.12 小结
- 第9章 值类型
- 9.1 结构
- 9.1.1 初始化结构
- 9.1.2 值类型的继承和接口
- 9.2 装箱
- 9.3 枚举
- 9.3.1 枚举之间的类型兼容性
- 9.3.2 在枚举和字符串之间转换
- 9.3.3 枚举作为标志使用
- 9.4 小结
- 第10章 合式类型
- 10.1 重写object的成员
- 10.1.1 重写ToString()
- 10.1.2 重写GetHashCode()
- 10.1.3 重写Equals()
- 10.1.4 用元组重写GetHashCode()和Equals()
- 10.2 操作符重载
- 10.2.1 比较操作符
- 10.2.2 二元操作符
- 10.2.3 二元操作符复合赋值
- 10.2.4 条件逻辑操作符
- 10.2.5 一元操作符
- 10.2.6 转换操作符
- 10.2.7 转换操作符规范
- 10.3 引用其他程序集
- 10.3.1 引用库
- 10.3.2 用dotnet CLI引用项目或库
- 10.3.3 用Visual Studio 2019引用项目或库
- 10.3.4 NuGet打包
- 10.3.5 用dotnet CLI引用NuGet包
- 10.3.6 用Visual Studio 2019引用NuGet包
- 10.3.7 调用被引用的包或项目
- 10.4 类型封装
- 10.4.1 类型声明中的public或internal访问修饰符
- 10.4.2 protected internal类型成员修饰符
- 10.5 定义命名空间
- 10.6 XML注释
- 10.6.1 将XML注释和编程构造关联
- 10.6.2 生成XML文档文件
- 10.7 垃圾回收
- 弱引用
- 10.8 资源清理
- 10.8.1 终结器
- 10.8.2 使用using语句进行确定性终结
- 10.8.3 垃圾回收、终结和IDisposable
- 10.9 推迟初始化
- 10.10 小结
- 第11章 异常处理
- 11.1 多异常类型
- 11.2 捕捉异常
- 11.3 重新抛出现有异常
- 11.4 常规catch块
- 11.5 异常处理规范
- 11.6 自定义异常
- 11.7 重新抛出包装的异常
- 11.8 小结
- 第12章 泛型
- 12.1 如果C#没有泛型
- 12.2 泛型类型概述
- 12.2.1 使用泛型类
- 12.2.2 定义简单泛型类
- 12.2.3 泛型的优点
- 12.2.4 类型参数命名规范
- 12.2.5 泛型接口和结构
- 12.2.6 定义构造函数和终结器
- 12.2.7 用default操作符指定默认值
- 12.2.8 多个类型参数
- 12.2.9 嵌套泛型类型
- 12.3 约束
- 12.3.1 接口约束
- 12.3.2 类型参数约束
- 12.3.3 非托管约束
- 12.3.4 非空约束
- 12.3.5 struct/class约束
- 12.3.6 多个约束
- 12.3.7 构造函数约束
- 12.3.8 约束继承
- 12.4 泛型方法
- 12.4.1 泛型方法类型推断
- 12.4.2 指定约束
- 12.5 协变性和逆变性
- 12.5.1 使用out类型参数修饰符允许协变性
- 12.5.2 使用in类型参数修饰符允许逆变性
- 12.5.3 数组对不安全协变性的支持
- 12.6 泛型的内部机制
- 12.7 小结
- 第13章 委托和Lambda表达式
- 13.1 委托概述
- 13.1.1 背景
- 13.1.2 委托数据类型
- 13.2 声明委托类型
- 13.2.1 常规用途的委托类型:System.Func和System.Action
- 13.2.2 实例化委托
- 13.3 Lambda表达式
- 13.3.1 语句Lambda
- 13.3.2 表达式Lambda
- 13.4 匿名方法
- 13.5 委托没有结构相等性
- 13.6 外部变量
- 13.7 表达式树
- 13.7.1 Lambda表达式作为数据使用
- 13.7.2 表达式树作为对象图使用
- 13.7.3 比较委托和表达式树
- 13.7.4 检查表达式树
- 13.8 小结
- 第14章 事件
- 14.1 使用多播委托实现Publish-Subscribe模式
- 14.1.1 定义订阅者方法
- 14.1.2 定义发布者
- 14.1.3 连接发布者和订阅者
- 14.1.4 调用委托
- 14.1.5 检查空值
- 14.1.6 委托操作符
- 14.1.7 顺序调用
- 14.1.8 错误处理
- 14.1.9 方法返回值和传引用
- 14.2 理解事件
- 14.2.1 事件的作用
- 14.2.2 声明事件
- 14.2.3 编码规范
- 14.2.4 泛型和委托
- 14.2.5 实现自定义事件
- 14.3 小结
- 第15章 支持标准查询操作符的集合接口
- 15.1 集合初始化器
- 15.2 IEnumerable使类成为集合
- 15.2.1 foreach之于数组
- 15.2.2 基于IEnumerable遍历集合
- 15.2.3 foreach循环内不要修改集合
- 15.3 标准查询操作符
- 15.3.1 使用Where()来筛选
- 15.3.2 使用Select()来投射
- 15.3.3 使用Count()对元素进行计数
- 15.3.4 推迟执行
- 15.3.5 使用OrderBy()和ThenBy()来排序
- 15.3.6 使用Join()执行内部联接
- 15.3.7 使用GroupJoin()实现“一对多”关系
- 15.3.8 调用SelectMany()
- 15.3.9 更多标准查询操作符
- 15.4 匿名类型之于LINQ
- 15.4.1 匿名类型
- 15.4.2 用LINQ投射成匿名类型
- 15.4.3 匿名类型和隐式局部变量的更多注意事项
- 15.5 小结
- 第16章 使用查询表达式的LINQ
- 16.1 查询表达式概述
- 16.1.1 投射
- 16.1.2 筛选
- 16.1.3 排序
- 16.1.4 let子句
- 16.1.5 分组
- 16.1.6 使用into实现查询延续
- 16.1.7 用多个from子句“平整”序列的序列
- 16.2 查询表达式只是方法调用
- 16.3 小结
- 第17章 构建自定义集合
- 17.1 更多集合接口
- 17.1.1 IList<T>和IDictionary<TKey, TValue>
- 17.1.2 ICollection<T>
- 17.2 主要集合类
- 17.2.1 列表集合:List<T>
- 17.2.2 全序
- 17.2.3 搜索List<T>
- 17.2.4 字典集合:Dictionary<TKey, TValue>
- 17.2.5 已排序集合:SortedDictionary<TKey, TValue>和SortedList<T>
- 17.2.6 栈集合:Stack<T>
- 17.2.7 队列集合:Queue<T>
- 17.2.8 链表:LinkedList<T>
- 17.3 提供索引器
- 17.4 返回null或者空集合
- 17.5 迭代器
- 17.5.1 定义迭代器
- 17.5.2 迭代器语法
- 17.5.3 从迭代器生成值
- 17.5.4 迭代器和状态
- 17.5.5 更多的迭代器例子
- 17.5.6 将yield return语句放到循环中
- 17.5.7 取消更多的迭代:yield break
- 17.5.8 在一个类中创建多个迭代器
- 17.5.9 yield语句的要求
- 17.6 小结
- 第18章 反射、特性和动态编程
- 18.1 反射
- 18.1.1 使用System.Type访问元数据
- 18.1.2 成员调用
- 18.1.3 泛型类型上的反射
- 18.2 nameof操作符
- 18.3 特性
- 18.3.1 自定义特性
- 18.3.2 查找特性
- 18.3.3 使用构造函数初始化特性
- 18.3.4 System.AttributeUsageAttribute
- 18.3.5 具名参数
- 18.4 使用动态对象进行编程
- 18.4.1 使用dynamic调用反射
- 18.4.2 dynamic的原则和行为
- 18.4.3 为什么需要动态绑定
- 18.4.4 比较静态编译和动态编程
- 18.4.5 实现自定义动态对象
- 18.5 小结
- 第19章 多线程概述
- 19.1 多线程基础
- 19.2 异步任务
- 19.2.1 为何使用TPL
- 19.2.2 理解异步任务
- 19.2.3 任务延续
- 19.2.4 用AggregateException处理Task上的未处理异常
- 19.3 取消任务
- 19.3.1 Task.Run()是Task.Factory.StartNew()的简化形式
- 19.3.2 长时间运行的任务
- 19.3.3 对任务进行资源清理
- 19.4 使用System.Threading
- 19.5 总结
- 第20章 基于任务的异步模式编程
- 20.1 同步执行高延迟操作
- 20.2 使用TPL实现异步执行高延迟操作
- 20.3 使用async/await实现基于任务的异步模式
- 20.4 异步返回值ValueTask<T>
- 20.5 异步流
- 20.6 IAsyncDisposable接口以及await using声明和语句
- 20.7 使用LINQ和IAsyncEnumerable
- 20.8 返回void的异步方法
- 20.9 异步Lambda表达式和本地函数
- 20.10 任务调度器和同步上下文
- 20.11 在Windows UI程序中使用async/await
- 20.12 小结
- 第21章 并行迭代
- 21.1 并行执行循环迭代
- 取消并行循环
- 21.2 并行执行LINQ查询
- 取消PLINQ查询
- 21.3 小结
- 第22章 线程同步
- 22.1 线程同步的意义
- 22.1.1 用Monitor同步
- 22.1.2 使用lock关键字
- 22.1.3 lock对象的选择
- 22.1.4 为什么要避免锁定this、typeof(type)和string
- 22.1.5 避免用MethodImplAttribute同步
- 22.1.6 将字段声明为volatile
- 22.1.7 使用System.Threading.Interlocked类
- 22.1.8 多个线程时的事件通知
- 22.1.9 同步设计最佳实践
- 22.1.10 更多同步类型
- 22.1.11 线程本地存储
- 22.2 计时器
- 22.3 小结
- 第23章 平台互操作性和不安全代码
- 23.1 平台调用
- 23.1.1 声明外部函数
- 23.1.2 参数的数据类型
- 23.1.3 使用ref而不是指针
- 23.1.4 为顺序布局使用StructLayoutAttribute
- 23.1.5 错误处理
- 23.1.6 使用SafeHandle
- 23.1.7 调用外部函数
- 23.1.8 用包装器简化API调用
- 23.1.9 函数指针映射到委托
- 23.1.10 设计规范
- 23.2 指针和地址
- 23.2.1 不安全代码
- 23.2.2 指针声明
- 23.2.3 指针赋值
- 23.2.4 指针解引用
- 23.2.5 访问被引用物类型的成员
- 23.3 通过委托执行不安全代码
- 23.4 小结
- 第24章 公共语言基础结构
- 24.1 CLI的定义
- 24.2 CLI的实现
- 24.3 .NET Standard
- 24.4 基类库
- 24.5 将C#编译成机器码
- 24.6 运行时
- 24.6.1 垃圾回收
- 24.6.2 平台可移植性
- 24.6.3 性能
- 24.7 程序集、清单和模块
- 24.8 公共中间语言
- 24.9 公共类型系统
- 24.10 公共语言规范
- 24.11 元数据
- 24.12 .NET Native和AOT编译
- 24.13 小结
展开全部
出版方
机械工业出版社有限公司
机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。