.NET相关知识点分享一
第一章 .NET Core入门
1 .NET 为什么要跨平台?
A. 安全考虑(Linux开源)
B. 成本原因(Windows收费)
C. 软件生态(服务器软件生态优先在Linux)
2 .NET Framework和.NET Core的区别?
- 跨平台支持:
- .NET Framework:最初是为Windows平台设计的,因此只能在Windows操作系统上运行。
- .NET Core:专注于跨平台支持,并且可以在Windows、macOS和Linux等多种操作系统上运行。
- 开源性:
- .NET Framework:在过去是封闭源代码的,但在后来的版本中,微软提供了部分源代码的访问权限。
- .NET Core:是一个完全开源的项目,其源代码可在GitHub上公开访问。
- 支持的应用类型:
- .NET Framework:主要用于开发Windows桌面应用程序、ASP.NET Web Forms和ASP.NET MVC等Web应用程序。
- .NET Core:可用于开发跨平台的桌面应用程序、Web应用程序、移动应用程序以及云服务等。
- 版本控制:
- .NET Framework:以版本号形式进行更新,例如.NET Framework 3.5、4.0、4.5等。
- .NET Core:在某个时间点之后,经历了版本变化,并逐渐演变为.NET 5、.NET 6等,最后演进为.NET 6和更高版本。
- 部署方式:
- .NET Framework:应用程序依赖于特定版本的.NET Framework,需要在目标机器上安装相应的.NET Framework版本才能运行。
- .NET Core:应用程序可以包含自身所需的.NET Core运行时,因此无需在目标机器上单独安装.NET Core。
- 性能:
- .NET Framework:由于历史原因,性能方面可能不如.NET Core,并且较旧版本可能会有性能问题。
- .NET Core:专注于性能优化,因此通常在性能方面表现更好。
- 后续发展:
- .NET Framework:自.NET Core的推出后,微软将其定义为“永久不会再有新的版本”,并且未来的新功能主要集中在.NET Core和后来的.NET 5及更高版本。
- .NET Core:最终与.NET 5合并为.NET 5,并成为.NET平台的未来发展方向。这个新的.NET平台统一了之前的.NET Framework和.NET Core,形成一个统一的、跨平台的.NET生态系统。
3 .NET Standard是什么?
.NET Standard是一种规范,规定了.NET Framework和.NET Core等共同实现的一组API,它不是一个框架,只是一种规范。从.NET 5开始,微软不再更新.NET Standard,而是把.NET 5、.NET 6等视为单一的代码库,在编译和运行时来检查不同平台所支持的功能差异。
4 .NET Core项目结构的创新之处?
.csproj 文件的区别:A. .NET Framework里,项目中的所有代码文件都要添加到*.csproj文件,如果某个没有添加到,这某个代码文件就不会被编译。
B. .NET Core项目中的代码文件不用添加到*.csproj文件里,而是默认都被自动包含到项目中,除非手动排除。
第二章 .NET Core 重难点知识
2.1 异步编程
2.1.1 什么是异步编程?有啥用处?
例子:“异步点餐” 说明
对照“异步点餐”的例子,异步编程的优点就是可以提高服务器接待请求的数量,但不会使得单个请求的处理效率变高,甚至有可能略有降低。
2.1.2 使用和编写异步方法?
在调用异步方法的时候,一般都要加上await关键字。如果一个方法中有await关键字,那么该方法也必须修饰为async。
async修饰了方法后,在方法内部直接返回int类型就行了,编译器会帮助我们把int转换为Task
2.1.3 async和await的原理?
async方法会被C#编译器编译成一个类,并根据await调用把方法切分成多个状态,对async方法的调用就会被拆分为若干次对MoveNext方法的调用。
2.1.4 async背后的线程切换
异步调用前的线程在异步等待期间会被放回线程池,等异步等待结束后,一个新的空闲线程会从线程池中被获取,异步等待调用后续的代码会在这个新的空闲线程中。
编译器会把async拆分成多次方法被调用,程序在运行的时候会通过线程池中取出空线程执行不同的MoveNext调用的方式来避免线程的“空等”,这样就提升系统的并发处理能力。
2.1.5 为什么有的异步方法没有async?
因为编译器会把async方法编译成类的缘故,这不仅会增加程序集的尺寸,而且运行效率一般也会比普通方法低。
对于使用async的异步方法,如果返回值是Task类型,我们可以直接用return结束方法的执行,比如如果方法的返回值是Task
如果由于某些框架的限制,我们编写的方法不能标注为async,那么在这个方法中就不能使用await调用异步方法。那么对于返回值为Task
2.1.4 CancellationToken的使用?
.NET Core中有很多异步方法中,有CancellationToken这个类型的参数,可以通过它提前终止异步方法。
2.1.5 WhenAll、WhenAny等方法的使用
await Task.WhenAll(t1,t2,t3); 同时等待多个Task的执行结束。
对应接口或者抽象类中的方法是不能修饰为async,但这些方法仍然可以把返回值设置为Task对象,在实现类中为方法添加async修饰。
2.2 LINQ
2.2.1 LINQ是什么?有啥用?本质是啥?
LINQ是.NET Core中提供的简化数据查询的技术。LINQ关键的功能是提供了集合类的扩展方法,所有实现了IEnumerable
2.2.2 LINQ能做什么?
A. 数据过滤 Where
B. 获取数据条数 Count
C. 判断是否至少有一条满足的数据 Any
D. 获取一条数据 Single、SingleOrDefault、First、FirstOrDefault
E. 排序 OrderBy、OrderByDescending
F. 限制结果集(主要用于分页查询,例如:从第2条开始获取3条数据,list.Skip(2).Take(3);)
G. 聚合函数 Max、Min、Average、Sum和Count,可以和前面的配合使用
H. 分组 GroupBy
I. 投影 Select,用于把集合中的每一项的数据类型进行转换。
J. 集合转换 IEnumerable
上述方法均可被链式调用!!!
2.2.3 LINQ另一种写法
除了上述的“方法语法外”,还有一种“查询语法”的写法。
C#编译器会把“查询语法”编译成“方法语法”,运行时没有区别。但是推荐“方法语法”。
第三章 .NET Core核心基础组件
3.1 依赖注入
3.1.1 什么是控制反转?有什么有用处?
控制反转就是把“我要创建对象”,变成“我要对象”。控制反转是设计模式中非常重要的思想,而依赖注入(DI)是控制反转思想的一种重要的实现方式。
依赖注入简化了模块的组装过程,减小了模块之间的耦合度。
3.1.2 实现控制反转的两种方式是什么?
一、服务定位器
二、依赖注入
3.1.3 .NET依赖注入的基本使用
.NET Core内置了控制反转机制,它同时支持依赖注入(主要)和服务定位器两种方式。(Microsoft.Extensions.DependencyInjection)
知道:
1、注册服务:“生命周期”的概念(3种:瞬态、范围和单例);分别指定服务类型和实现类型(可相同可不同)
2、获取服务的时候必须指定获取什么类型的服务。
使用时:
1、创建 用于注册服务的容器:容器的接口IServiceCollection(里定义了3种不同“生命周期”的范围服务),默认实现类使用ServiceCollection类注册服务
2、使用IServiceCollection的BuildServiceProvider创建对象