描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302526506丛书名: 微软技术开发者丛书
? 内容全面 本书案例涉及从面向对象编程基础到文件与目录管理、数据处理、异步编程,再到网络通信、反射、组件合成、加密算法等高级技术。
? 实践性强 所有案例都可以独立运行,效果直观,针对性强。读者还可以根据自己的学习体验对书中案例进行修改与扩展。
? 轻松阅读 全书以实用案例为主,以理论阐述为辅。每个案例的“导语”部分先对相关技术要点作简要说明,省去冗长枯燥的论述,使学习更有趣。
? 适用面广 本书虽以案例讲解为主,但内容仍紧扣基础知识,适合作为各大培训机构的培训教材或者高校计算机类专业.NET Core相关课程的参考教材。
为了便于读者学习,本书提供了所有实例的配套源代码,在开发环境中运行,能直观地看到每个实例的运行效果。本书适合作为普通高校.NET Core技术相关课程的教学用书,也可以作为相关培训机构的培训教材,还可作为从事.NET Core技术开发的IT从业者的参考用书。
丛书序(沈向洋)1
前言3
第一篇基 础 知 识
第1章搭建开发与测试环境
1.1在Windows上安装开发环境
实例1安装Visual Studio
实例2修复Visual Studio
1.2在Linux操作系统中配置测试环境
实例3启用Windows上的Linux子系统
实例4设置root密码
实例5在Linux系统中安装.NET Core SDK
实例6在Linux系统中安装.NET Core运行时
第2章应用程序项目管理
2.1.NET Core命令行工具的使用
实例7使用命令行工具创建.NET Core项目
实例8定义新项目的名称与存放位置
实例9编译应用程序项目
实例10编译项目的Release版本
实例11创建解决方案文件
实例12枚举或删除解决方案中的项目
实例13运行应用程序
2.2Visual Studio开发环境
实例14使用Visual Studio创建项目
实例15在Visual Studio中运行项目
实例16显示代码行号
实例17在C# Interactive窗口中做代码实验
实例18在解决方案中添加和移除项目
实例19添加NuGet包引用
实例20清除NuGet包缓存
实例21保存窗口布局
实例22给代码打书签
2.3代码注释
实例23单行注释
实例24多行注释
实例25文档注释
2.4发布.NET Core应用项目
实例26在Visual Studio中发布.NET Core应用
实例27使用Visual Studio发布可独立运行的项目
实例28使用dotnet命令行工具发布“自包含”项目
第3章C#语言基础
3.1命名空间
实例29使用namespace关键字
实例30嵌套命名空间
实例31引入命名空间
实例32在命名空间内部引入其他命名空间
实例33使用全局命名空间
实例34为引入的命名空间设置别名
实例35使用using static指令
3.2变量与常量
实例36一次性声明多个变量
实例37让编译器自动推断变量的类型
实例38使用常量
实例39获取变量的内存地址
实例40输出变量的名称
实例41为变量分配默认值
3.3程序入口点
实例42获取命令行参数
实例43处理多个入口点
3.4流程控制
实例44奇数还是偶数
实例45使用for循环输出文本
实例46生成由字符组成的图案
实例47死循环的处理方法
实例48退出循环的方法
实例49输出20以内能被3整除的正整数
实例50做一道选择题
实例51switch语句的类型匹配
实例52在case语句中使用when子句
实例53代码跳转
第4章面向对象编程
4.1类与结构
实例54声明公共类
实例55为结构定义构造函数
实例56构造函数的相互调用
实例57静态构造函数
实例58验证属性值的有效性
实例59初始化只读字段
实例60重载方法
实例61类实例传递给方法后为什么没有被更改
实例62输出参数
实例63可变个数的方法参数
实例64使用按引用传递的返回值
实例65按参数名称来传值
实例66可选参数
实例67在声明时初始化属性
4.2委托与事件
实例68委托实例如何绑定方法
实例69绑定多个方法
实例70匿名方法
实例71封装事件
实例72框架提供的委托类型
实例73将方法作为参数进行传递
实例74使用Lambda表达式动态产生数据
4.3继承与多态
实例75调用基类的构造函数
实例76重写基类的成员
实例77彻底替换基类的成员
实例78实现多个接口
实例79实现接口的结构
实例80隐藏构造函数
实例81到底调用了谁
实例82析构函数
实例83实现IDisposable接口
实例84显式实现接口
实例85阻止类被继承
实例86嵌套类
实例87匿名类型
4.4枚举
实例88声明枚举类型
实例89指定枚举的基础类型
实例90常量的标志位运算
实例91自动产生的常量值
实例92获取枚举中常量的名称
实例93检查枚举实例中是否包含某个标志位
4.5特性
实例94自定义特性类
实例95向特性类的构造函数传递参数
实例96在同一对象上应用多个特性实例
实例97在运行阶段检索特性实例
实例98方法的返回值如何应用特性
4.6运算符
实例99计算一个整数的阶乘
实例100按位平移
实例101是“大”还是“小”
实例102typeof运算符的作用
实例103使用“ ”运算符将两个对象的属性值相加
实例104对null进行判断
4.7类型转换
实例105强制转换
实例106将int数值隐式转换为double数值
实例107输出整数的二进制表示形式
实例108将字节数组转换为字符串
实例109重写ToString方法
实例110将整数转换为十六进制字符串
实例111自定义隐式转换
4.8可以为null的值类型
实例112访问可以为null的值类型
实例113为NullableT实例分配默认值
第5章数学运算与字符串处理
5.1简单数学计算
实例114求一组整数中的最大值和最小值
实例115计算平均值
实例116计算一个数值的绝对值
实例117计算一个矩形序列的周长总和
实例118求某个角度的正弦值
实例119求某个数值的立方
实例120计算矩形的对角线长度
实例121处理超大整数
5.2日期/时间换算
实例122今天是星期几
实例123获取指定日期的农历日期
实例124一天内总共有多少秒
实例125日期的加/减运算
实例126从日期字符串中产生DateTime实例
5.3常用的字符串处理
实例127使用Concat方法拼接字符串
实例128使用“ ”运算符拼接字符串
实例129字符串的包含关系
实例130字母的大小写转换
实例131使用分隔符连接字符串
实例132查找以“ay”结尾的单词
实例133依据指定的分隔符来拆分字符串
实例134替换字符串
实例135反转字符串
实例136插入与删除字符
实例137填充剩余“空白”
实例138判断字符是否为数字
实例139截取字符串
实例140使用StringBuilder组装字符串
实例141字符串查找
实例142比较字符串时忽略大小写
实例143“@”符号在字符串中的用途
实例144处理字符串中出现的双引号
5.4格式控制符
实例145输出百分比
实例146输出当前语言中的货币格式
实例147输出多个币种格式
实例148数字的两种常用格式
实例149使用字符串内插
实例150长日期与短日期
实例151自定义日期和时间格式
实例152自定义小数位数
5.5从字符串到其他类型的转换
实例153从二进制字符串产生int实例
实例154Parse与TryParse方法
实例155对字符串进行UTF8编码
实例156字符串的HTML编码
实例157字符串隐式转换为自定义类
第6章泛型与集合
6.1泛型
实例158使用泛型参数
实例159实现泛型接口
实例160限制泛型参数只能使用值类型
实例161泛型方法
实例162将泛型参数限制为枚举类型
实例163泛型参数的输入与输出
实例164在委托类型中使用泛型
实例165将抽象类作为类型约束
6.2数组
实例166四种方式初始化数组实例
实例167创建二维数组
实例168使用简化语法初始化多维数组
实例169使用Array类创建数组实例
实例170SetValue方法与GetValue方法
实例171获取某个维度的元素个数
实例172动态调整数组的大小
实例173反转数组
实例174查找符合条件的元素
实例175查找符合条件的元素的索引
实例176确定数组中元素的存在性
实例177复制数组中的元素
6.3集合
实例178将数字进行降序排列
实例179初始化ListT集合
实例180实现IEnumerator接口
实例181IEnumerable接口与foreach循环
实例182IEnumerableT与foreach循环
实例183IEnumerable接口与yield return语句
实例184无重复元素的集合
实例185双向链表
实例186自定义相等比较
实例187清空集合中的所有元素
实例188判断字典集合中是否存在某个键
实例189定义索引器
实例190带多个参数的索引器
实例191使用泛型的栈队列
实例192自动排序的字典集合
实例193自定义SortedDictionary集合的排序规则
实例194“先进先出”队列
实例195自定义ToReadOnlyDictionary方法
实例196初始化字典集合的方法
实例197ArrayList的使用
实例198使用SpanT提升处理字符串的性能
实例199多个Task同时操作ConcurrentBag集合
实例200跨线程访问BlockingCollection集合
6.4元组
实例201Tuple类的使用
实例202推荐使用的元组——ValueTuple
实例203C#语法中的ValueTuple
实例204重命名元组的字段
实例205将元组解构为变量
实例206解构自定义类型
实例207将元组作为返回值
第7章LINQ与动态类型
7.1常见的扩展方法
实例208求最大值与最小值
实例209求工序列表中最长的加工周期
实例210计算字符串的总长度
实例211合并两个序列
实例212有多少个矩形的面积超过100cm2
实例213按员工年龄进行降序排列
实例214去掉重复的元素
实例215筛选出两个序列中的差异元素
实例216处理First方法抛出的异常
实例217当序列中有且仅有一个元素时
实例218筛选出手机号以135或136开头的联系人信息
实例219将对象转换为字典集合
实例220将原始序列进行分组
7.2LINQ语法
实例221筛选能被5整除的整数
实例222求序列中元素的平方根并按降序排列
实例223select子句返回的内容
实例224按员工所属部门分组
实例225“内联”查询
实例226处理查询中的异常
实例227DefaultIfEmpty方法的作用
实例228使用LINQ将序列转换为XML文档
实例229将分组后的序列重新排序
实例230将字典集合转换为字符串序列
实例231修改XML元素的内容
实例232使用并行LINQ
实例233将XML转换为元组
实例234生成带命名空间的XML文档
实例235添加命名空间前缀
7.3动态类型
实例236通过ExpandoObject类创建动态实例
实例237以字典形式访问ExpandoObject
实例238自定义的动态类型
实例239在自定义动态类型中直接定义成员
实例240模拟委托实例的调用
第二篇技 术 进 阶
第8章文件与I/O
8.1目录与文件
实例241创建目录与文件
实例242修改文件的创建时间
实例243使用FileInfo类来创建文件
实例244判断目录是否已经存在
实例245向文件追加文本
实例246覆写文件内容
实例247使用FileInfo类删除文件
实例248以行的形式写入文本
实例249重命名目录
实例250通过ReadAllLines方法读取文件中的所有行
实例251依据文件的大小排序
实例252枚举磁盘驱动器
8.2流
实例253向内存流写入内容
实例254将内存流中的内容转换为字节数组
实例255从内存流中读取内容
实例256使用StreamWriter类将文本写入文件
实例257使用StreamReader类读取文本文件
实例258调用Seek方法重新设置流的当前位置
实例259通过Position属性更改流的当前位置
8.3压缩与解压缩
实例260使用DeflateStream类压缩文件
实例261创建Zip压缩文档
实例262使用GZipStream类压缩文件
8.4内存映射文件
实例263读写内存映射文件
实例264将内存映射文件写入磁盘文件
8.5命名管道
实例265实现本地进程之间的通信
实例266单向管道通信
第9章序列化
9.1简单序列化方案
实例267二进制序列化
实例268使用DataContractSerializer类进行序列化
实例269将类型实例序列化为JSON格式
实例270在序列化时忽略某些字段
9.2XML序列化
实例271XmlSerializer与XML序列化
实例272自定义封装集合类型成员的XML元素名称
实例273自定义XML元素的名称
实例274将类型成员序列化为XML特性
实例275自定义XML命名空间
实例276自定义数组类型成员的XML元素
9.3数据协定
实例277数据协定的简单定义
实例278自定义协定的名称
实例279不同的类型使用相同的数据协定
实例280将数据协定序列化为JSON格式
实例281序列化数据协定时忽略某个成员
实例282改变数据协定成员的序列化顺序
实例283保留实例引用
第10章异步与并行
10.1线程
实例284Sleep方法的妙用
实例285创建新线程
实例286启动新线程并传递参数
实例287等待线程信号——ManualResetEvent
实例288等待线程信号——AutoResetEvent
实例289多个线程同时写一个文件
实例290使用线程锁
10.2并行任务
实例291启动Task的三种方法
实例292带返回值的Task
实例293传递状态数据
实例294串联并行任务
实例295使用Parallel类执行并行操作
10.3异步等待语法
实例296声明异步方法
实例297在Main方法中使用异步等待
实例298为每个线程单独分配变量值
实例299保留异步上下文中的本地变量值
实例300取消并行任务
第11章网络编程
11.1Socket通信
实例301简单的TCP通信程序
实例302TcpListener与TcpClient
实例303使用UdpClient类开发简单的聊天程序
11.2HTTP编程
实例304从Web服务器上下载图片
实例305使用HttpClient类向Web服务器提交数据
第12章反射与Composition
12.1反射技术
实例306获取程序集中的类型列表
实例307获取指定类型的成员列表
实例308获取方法的参数信息
实例309通过反射调用构造函数
实例310通过反射调用静态方法
实例311用Activator类创建类型实例
实例312检测类型上所应用的自定义Attribute
12.2Composition
实例313安装NuGet包——System.Composition
实例314导出类型
实例315通过协定来约束导出类型
实例316导入多个类型
实例317导出元数据
实例318使用自定义类型来接收导入的元数据
实例319封装元数据
实例320用抽象类来充当协定类型
第13章加密算法
13.1单向加密
实例321计算输入字符串的MD5值
实例322使用SHA1算法校验文件
13.2双向加密
实例323使用AES算法加密和解密文本
实例324不需要初始向量的AES加密
实例325用RSA算法加密和解密数据
第三篇ASP.NET Core
第14章应用启动
14.1Web主机配置
实例326使用默认配置创建Web主机
实例327配置Web服务器的URL
实例328使用Kestrel服务器组件
实例329配置Web项目的调试方案
14.2Startup
实例330基于方法约定的Startup类
实例331使用IStartup接口定义Startup类
实例332无Startup启动应用程序
14.3启动环境
实例333使用非预定义环境
实例334使Startup类匹配启动环境
第15章依赖注入与中间件
15.1服务
实例335枚举应用程序中已添加的服务
实例336编写服务类型
实例337理解服务的生命周期
15.2依赖注入
实例338实现SHA1计算服务
实例339Startup.Configure方法的依赖注入
实例340临时访问服务
15.3中间件
实例341以委托形式定义中间件
实例342定义中间件类
实例343带参数的中间件
实例344IMiddleware接口的用途
实例345让HTTP管道“短路”
实例346中间件的分支映射
第16章MVC与Web API
16.1Razor Web页面应用
实例347自定义Razor页的根目录
实例348Razor页面与页面模型关联
实例349Razor Page应用的路由映射
实例350通过@page指令设置Razor页面的URL路由
实例351自定义页面的handler方法
16.2MVC(模型框架视图)
实例352为全局路由字段分配默认值
实例353局部的URL路由
实例354自定义视图文件的查找位置
实例355根据URL查询参数返回不同的视图
实例356自定义的控制器类
实例357阻止控制器中的方法被公开为Action方法
实例358重命名Action方法
实例359使用布局页
实例360_ViewStart视图与_ViewImports视图
实例361向视图传递模型对象
实例362在控制器中接收服务列表的注入
实例363使用IFormCollection组件来提取form表单数据
实例364在Web API中直接提取上传的文件
实例365用部分视图来显示当前日期
实例366使用视图组件
实例367在视图中接收依赖注入
16.3静态文件与目录浏览
实例368访问静态文件
实例369开启目录浏览功能
实例370文件服务
第17章应用配置与数据库访问
17.1配置应用程序
实例371自定义环境变量的命名前缀
实例372使用JSON文件进行配置
实例373自定义命令行参数映射
实例374使用内存中的配置源
17.2选项类
实例375选项类的使用方法
实例376使用JSON文件来配置选项类
17.3实体框架
实例377为实体模型设置主键
实例378迁移实体并生成数据库
实例379内存数据库
实例380在应用程序运行期间创建SQLite数据库
经过10多年的发展,Microsoft .NET Framework已经相当成熟,拥有强大的类库与可视化框架,融合了许多新技术。在Windows平台上,从桌面应用到Web应用都能完美胜任。
.NET Core是在原.NET框架的基础上开发的新一代开源项目,人们期待已久的.NET跨平台终于实现(基于.NET Core开发的应用程序可以运行在Windows、Linux、Mac OSX等操作系统上)。.NET Core项目由微软官方团队、第三方开发团队及社区用户共同维护。.NET Core从原有的.NET Framework抽取出最基础、最核心的API重新开发,作为.NET的新标准发布,第三方开发人员可以在此标准上进行自由扩展。
本书所有内容均以实例的形式呈现,容易上手。每个实例都包含两部分内容: 【导语】部分主要对实例中要用到的核心知识点进行介绍; 【操作流程】部分详细讲述完成实例项目的步骤,读者可以直接动手实践,亲自体验编程的乐趣。
本书内容分为三篇:
第一篇基础知识。涉及开发环境的搭建、基础类型、流程控制、常用集合、LINQ语法和面向对象思想等内容。
第二篇技术进阶。强化编程技能,此部分的实例包括文件与目录操作、基础I/O、序列化/反序列化、网络与异步编程、反射与加密算法应用等内容。
第三篇ASP.NET Core。此部分主要包括与Web开发相关的实例,重点涉及Web Host初始化、中间件、依赖注入、应用配置、EF Core等关键知识。
笔者曾写过与C# 编程相关的书,写作此书的想法是源于几位网友在微博私信中的提问,经过一番斟酌,我认为有必要编写一本与.NET Core有关的书,毕竟.NET Core作为全新的跨平台项目,存在不少新的特性。不过本书中未使用大篇幅讲解的叙述方式,而是采用以单独实例驱动为主,以知识阐述为辅的方式,重点在于调动读者积极上机实战的兴趣。经常有初学编程的朋友问我: 为什么看书的时候感觉自己学会了,但一敲代码就什么都忘了?其实,没有人天生就会写代码,之所以会有这种遗忘现象的发生,说到底是练得太少了,总觉得书上的例子很简单,而不愿意动手去敲一遍。
.NET Core作为开源项目,可能会有许多扩展项目,涉及内容较广,由于篇幅与作者的水平有限,本书不能覆盖所有的应用领域,仅精选出与.NET Core主体框架关系密切且较为实用的实例进行演示,提供给大家作为参考。
最后,感谢各位同仁与广大网友对我的支持,也感谢清华大学出版社,我们已经合作出版过多种图书。
周家安
2019年7月
C#语言基础
在本章节中,读者将学习到以下内容:
使用命名空间;
变量与常量;
声明程序入口点;
流程控制。
3.1命名空间
实例29使用namespace关键字
【导语】
命名空间有两个作用: 一是把各种类型按照用途进行分组,二是解决命名冲突。
第一个作用是将类型归类,例如在.NET类库中,有一个System.Security.Cryptography命名空间,根据其命名,可以知道在该命名空间下面的类型与安全技术有关,并且包含用于加密或解密的API。
对于第二个作用,假设用户在程序代码声明两个类型,它们的名字都是P,虽然名字相同,但两个P类型的功能是完全不同的。为了解决同名冲突,就可以分别把两个P类型放在不同的命名空间下,例如第一个P类型放在N1命名空间下,全名称为N1.P,再把第二个P类型放在N2命名空间下,全名称为N2.P。这样N1.P与N2.P就不再发生命名冲突了。
定义命名空间使用namespace关键字,定义后就可以将类型放置在命名空间中。
【操作流程】
步骤1: 在Visual Studio开发环境中新建控制台应用程序项目。
步骤2: 新建项目后,会自动打开项目模板生成的Program.cs文件。从生成的代码中可以看到,默认的命名空间与项目名字相同,例如,用户给项目命名为Demo,那么代码默认的命名空间同样为Demo。如代码清单31所示。
代码清单31模板生成的命名空间
namespace Demo
{
…
}
在Demo命名空间下,有一个Program类(用class关键字声明),Program类下面还有一个Main方法,它是整个程序的入口点,即应用程序会从Main方法开始执行,当退出Main方法后,程序也随之退出。完整结构如代码清单32所示。
代码清单32模板生成的完整程序结构
using System;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(“Hello World!”);
}
}
}
步骤3: 在项目生成的命名空间外(即命名空间的右大括号外)另起新行,使用namespace关键字声明一个Test命名空间。
namespace Test
{
}
注意:
命名空间是一种容器,里面可以包含类型,属于代码块,因此在命名空间后面要加上一对大括号。
步骤4: 在定义好的Test命名空间两个大括号之间定义一个Car类。声明类使用class关键字,class也是一种类型。
namespace Test
{
public class Car
{
}
}
注意:
类型内部可以包含类型成员,因此类定义之后也要附加一对大括号。
步骤5: 在Car类中再定义一个方法。
namespace Test
{
public class Car
{
public void Run()
{
Console.WriteLine(“开车啦。”);
}
}
}
当调用Run方法时,会在控制台窗口输出文本信息。
步骤6: 回到Program类的Main方法,用以下代码替换默认生成的代码。
static void Main(string[] args)
{
Test.Car c = new Test.Car();
c.Run();
}
上面代码首先声明一个Car类型的变量c,并且通过new关键字进行实例化,然后调用Run方法。
步骤7: 按F6快捷键生成解决方案。
步骤8: 打开“命令提示符”窗口,定位到项目文件目录下的\bin\Debug\netcoreapp子目录下。
步骤9: 输入以下命令,执行应用程序。
dotnet .dll
步骤10: 如果看到输出文本“开车啦”,说明程序已经正确执行。
实例30嵌套命名空间
【导语】
命名空间下面不仅可以包含类型,还可以嵌套命名空间。即命名空间A下面可以包含命名空间B,命名空间B下面还可以包含命名空间C。
【操作流程】
步骤1: 新建控制台应用程序,命名为Demo。
步骤2: 在生成的Demo命名空间之外,另声明一个命名空间,命名为NTest。
namespace NTest
{
}
步骤3: 在NTest命名空间下再声明两个命名空间,分别命名为NSub1、NSub2。
namespace NTest
{
namespace NSub1
{
}
namespace NSub2
{
}
}
评论
还没有评论。