- 前言
- 请详细看官方文档
- 常用的dotnet 命令行
- vs的快捷键
- 一、 .NET是开发平台
- 1、.NET是 什么?
- 2、.NET Framework缺点
- 3、.NET Core的优点
- 4、.NET Standard类库
- 5、.NET 开发工具
- 6、其他
- 二、学习参考
- 1. 异步编程
- 2. 依赖注入
- 3. .Net 框架的组件
- 三、 lambda与LINQ、表达式树
- 1.学习参考:
- 2.表达式树
- 总结
前言 请详细看官方文档 常用的dotnet 命令行
dotnet --version //查看版本 dotnet new console//当前文件夹下创建控制台项目 dotnet --list-sdks//查看已安装的sdk dotnet new webapi -f net6.0//创建一个Web API 项目 dotnet run //构建并运行 // NuGet Install-Package XXX。-Version//指定版本。 Uninstall-Package XXX//卸载 Update-Package XXX//更新到最新版vs的快捷键
CTRL+K+C//1.注释 CTRL+K+U//2.取消注释 CTRL+L//删除该行 CTRL+Enter//在光标所在行的上面插入一行 CTRL+Shift+Enter//在光标所在行的下面插入一行 CTRL+F//查找.替换 Shift+Alt+方向键(或鼠标)//代码行和列进行选择,对批量删除某些代码 Ctrl+J//智能提示 Ctrl+Tab//快速切换窗口 Ctrl+M,M//快速隐藏或显示当前代码段 Ctrl+Shift+B//生成解决方案 SHIFT + ALT + ENTER//全屏显示/退出全屏显示 Alt+向上键 // 上移行 Alt+向下键 // 下移行一、 .NET是开发平台 1、.NET是 什么?
.NET 是NET Framework、.NET Core、Xamarin/Mono的统称。
- .NET Framework:近20年历史,.NET简称的最早拥有者,用于开发Windows程序。
- Xamarin/Mono主要做移动开发:Xamarin、Unity。Mono也能做Web等跨平台开发,但主要专注移动端。
- .NET Core:免费、跨平台、开源。跨平台:程序可以运行在Windows、Linux、Mac等操作系统下。
1、系统级别的安装,互相影响 2、无法独立部署 3、ASP.NET 和IIS深度耦合 4、ASP.NET资源消耗大 5、非云原生 .NET Framework历史包袱: 1、带着手铐脚镣长大的ASP.NET MVC 2、ASP.NET底层不支持很好的单元测试3、.NET Core的优点
1)支持独立部署,不互相影响; 2)彻底模块化; 3)没有历史包袱,运行效率高 4)不依赖于IIS 5)跨平台 6)符合现代开发理念:依赖注入、单元测试等4、.NET Standard类库
1.NET Standard只是规范,一个.NET Standard类库可以被支持其版本的.NET Framework、.NET Core,Xamarin等引用。而.NET Core库、.NET Framework类库则不可以。 2.如果编写一个公用的类库,尽量选择.NET Standard,并且尽量用低版本。5、.NET 开发工具
1) .NET CLI: 命令行 2) Visual Studio: Windows-Only (推荐) 3) Visual Studio for Mac 4) Jetbrains Rider:(挺好用的,不骗人) 5) VS Code (Visual Studio Code): 跨平台6、其他
1.从.NET 5开始,微软开始淡化其他叫法,统一为.NET,后续默认.NET就是指的.NET Core。 2.文档中英文切换。也许可以手动改 zh-cn/en-us 3.自学就要养成把相关文档“翻一翻”的意识。
包管理
Linux:apt、yum Javascript:npm Java:Maven、Gradle Python:pip .net:NuGet二、学习参考
1. 异步编程
使用 Async 和 Await 的异步编程
异步方法”:用async关键字修饰的方法
1 .异步方法的返回值一般是Task,T是真正的返回值类型,Task。惯例:异步方法名字以Async结尾。
2. 即使方法没有返回值,也最好把返回值声明为非泛型的Task。
3.调用泛型方法时,一般在方法前加上await关,这样拿到的返回值就是泛型指定的T类型;
4.异步方法的“传染性”:一个方法中如果有await调用,则这个方法也必须修饰为async
async方法缺点:
1、异步方法会生成一个类,运行效率没有普通方法高;
2、可能会占用非常多的线程;
…
如果想在异步方法中暂停一段时间,不要用Thread.Sleep(),因为它会阻塞调用线程,而要用await Task.Delay()。举例:下载一个网址,3秒后下载另一个。
异步与yield:
复习: yield return不仅能够简化数据的返回,而且可以让数据处理“流水线化”,提升性能
static async Task2. 依赖注入DownloadAsync(string url, string destFilePath) { string body; using (HttpClient httpClient = new HttpClient()) { body = await httpClient.GetStringAsync(url); } await File.WriteAllTextAsync(destFilePath, body); return body.Length; }
- 生活中的“控制反转”:自己发电和用电网的电。
依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的实现方式。 - 依赖注入简化模块的组装过程,降低模块之间的耦合度
- .NET的DI默认是构造函数注入。
3. .Net 框架的组件控制反转两种实现方式:
- 服务定位器(ServiceLocator);
- 依赖注入(Dependency Injection,DI)
DI几个概念
服务(service):对象;注册服务;
服务容器:负责管理注册的服务;
查询服务:创建对象及关联对象;
对象生命周期:Transient(瞬态); Scoped(范围); Singleton(单例);
- 公共语言运行库(Common Language Runtime - CLR)
- .Net 框架类库(.Net Framework Class Library)
- 公共语言规范(Common Language Specification)
- 通用类型系统(Common Type System)
- 元数据(Metadata)和组件(Assemblies)
- Windows 窗体(Windows Forms)
- ASP.Net 和 ASP.Net AJAX
- ADO.Net
- Windows 工作流基础(Windows Workflow Foundation - WF)
- Windows 显示基础(Windows Presentation Foundation)
- Windows 通信基础(Windows Communication Foundation - WCF)
- LINQ
-
为什么要学LINQ?让数据处理变得简单
-
LINQ中提供了大量类似Where的扩展方法,简化数据处理。
-
委托→lambda→LINQ
-
LINQ中所有的扩展方法几乎都是针对IEnumerable接口的,而几乎所有能返回集合的都返回IEnumerable,所以是可以把几乎所有方法“链式使用”的。
学习参考1
学习参考2
(复习)委托
1、委托是可以指向方法的类型,调用委托变量时执行的就是变量指向的方法。举例。
2、.NET 中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型。
//统计一个字符串中每个字母出现的频率(忽略大小写),然后按照从高到低的顺序输出出现频率高于2次的单词和其出现的频率。
var items = s.Where(c => char.IsLetter(c))//过滤非字母
.Select(c => char.ToLower(c))//大写字母转换为小写
.GroupBy(c => c)//根据字母进行分组
.Where(g=>g.Count()>2)//过滤掉出现次数<=2
.OrderByDescending(g => g.Count())//按次数倒序排序
.Select(g=>new { Char=g.Key,Count=g.Count()});
//委托变量不仅可以指向普通方法,还可以指向匿名方法
Func f1 = delegate (int i1, int i2) {
return $"{i1}+{i2}={i1 + i2}";
};
string s = f1(1, 2);
//匿名方法可以写成lambda表达式
Func f1 = (i1,i2) =>{
return $"{i1}+{i2}={i1 + i2}";
};
Func f1 = (i1, i2) => $"{i1}+{i2}={i1 + i2}";
//如果委托没有返回值,且方法体只有一行代码,可省略 {}
Action a1 = (age, name) => Console.WriteLine($"年龄{age},姓名{name}");
a1(18, "yzk");
//如果只有一个参数,参数的()可以省略。
Action f1 = s => Console.WriteLine(s);
//==================================
//var让编译器的“类型推断,是强类型,弱类型是dynamic
using System.Linq;
int[] nums = new int[]
{ 3,99,88,77,7,8,9,66,15,7};
IEnumerable items = nums.Where(i=>i>10);
Count()//方法:获取数据条数
int count2 = list.Where(e => e.Salary > 5000 || e.Age < 30).Count();
Any()//方法:是否至少有一条数据
bool b2 = list.Where(e => e.Salary > 8000).Any();
Max()、Min () 、Average () 、Sum () 、Count ()//聚合函数
ist.Where(e => e.Age > 30).Min(e=>e.Salary)
GroupBy()//分组条件
//投影:把集合中的每一项转换为另外一种类型。
IEnumerable names = list.Select(e=>e.Gender?"男":"女");
var dogs = list.Select(p=>new Dog{NickName=e.Name,Age=e.Age});
//集合转换:我们可以用ToArray()方法和ToList()分别把IEnumerable转换为数组类型和List类型。
//使用Where、OrderBy、Select等 扩展方法进行数据查询的写法叫做 “LINQ方法语法”。还有一种“查询语法”的写法。
var items2 = from e in list
where e.Salary > 3000
orderby e.Age
select new { e.Name, e.Age, Gender = e.Gender ? "男" : "女" };
2.表达式树
1、表达式树(Expression Tree):树形数据结构表示代码,以表示逻辑运算,以便可以在运行时访问逻辑运算的结构。 2、Expression总结类型 3、从Lambda表达式来生成表达式树: Expression > e1 = b =>b.Price > 5; //Expression和委托的关系和区别 1、把Expression >换成Func ,写成下面的版本: Func e = b => b.Price > 5; ctx.Books.Where(e).ToList(); 2、Expression对象储存了运算逻辑,它把运算逻辑保存成抽象语法树(AST),可以在运行时动态获取运算逻辑。而普通委托则没有。 //通过代码查看AST 1、Install-Package ExpressionTreeToString 2、Expression > e = b => b.AuthorName.Contains("杨中科")||b.Price>30; Console.WriteLine(e.ToString("Object notation", "C#"));
有待更新



