展开全部

主编推荐语

本书探讨了一些较为复杂的编程思想,并深入讨论了语言较新版本(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 小结
展开全部

评分及书评

评分不足
1个评分

出版方

机械工业出版社有限公司

机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。