c#慕课课程
1.CLI与CLR
CLI:Common Language Infrastructure 公共语言基础框架,处理代码过程
CLR:Common Language Runtime 公共语言运行时(服务环境,运行环境)

2.Console IO操作工具集
1)Write与WriteLine
Write:直接将数据显示在命令行中不做处理
WriteLine:数据显示在命令行中并换行
2)Read、ReadKey与ReadLine
Read:每次读取用户第一次按下的键盘按钮
int a = Console.Read();
Console.WriteLine(a);
/*
A
65
*/
2
3
4
5
6
ReadLine:可以读取回车前输入的所有数据,并换行
string a = Console.ReadLine();
Console.WriteLine(a);
/*
Good Afternoon!
Good Afternoon!
*/
2
3
4
5
6
ReadKey:输出指令类ASCII码,例如回车
ConsoleKeyInfo c = Console.ReadKey();
Console.WriteLine(c.Key);
/*输入回车
Enter
*/
2
3
4
5
3)Clear
Clear:将命令行中所有命令删除
Console.Clear();
/*输入回车
*/
2
3
4
3.区分数据类型的意义:防止做无效操作
4.基本数据类型

注意:中文只能用string表示,而不能用char表示。
5.内建类型:string,object,dynamic
6.if 、switch和三元运算

三个以上建议使用switch

三元运算(?:):适用于两个判断
格式:条件(输出为true或false)?结果1(true进入结果):结果2(false进入结果)
7.方法及其签名


8.功能的聚合问题(功能高内聚,模块低耦合)
耦合:依赖问题,类A依赖于类B,当类B做出修改时,类A需要重新编译
当牵一发而动全身时,就会出现高耦合的现象
实现低耦合的方法:
1.封装,对业务逻辑实现细节的隐藏
2.类的关联性,依赖、关联、聚合、组合、泛化等(耦合度一次递增)
3.使用接口(重中之重)
9.索引

10.局部类


11.向上转型&向下转型
向上转型(upcasting):把一个派生类类型转换为ta的基类
向下转型(downcasting):把一个基类转换为ta的某个派生类
public class Shape{
//comment
}
public class Circle : Shape{
//comment
}
Circle circle = new Circle();
//向上转型,隐式转换
Shape shape = circle;
//向下转型,显式转换,转化可能失败
Circle circle2 = (Circle)shape;
Car car = (Circle)shape;//转换失败,抛出异常,可以用as
Car car = shape as Circle;
if(car != null){
//执行后续操作
}
/*or
if(car is Circle){
Car car = (Circle)shape;//绝对不会出错
}
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
12.装箱与拆箱
装箱(boxing):值类型转化为引用类型的过程,基本类型转化为对象类型,保存位置由栈(Stack)转移到堆(Heap)中。
拆箱(unboxing):引用类型转化为值类型的过程,对象类型转化为基本类型,保存位置由堆(Heap)转移到栈(Stack)中。
object obj = 10;
int number = (int)obj;
2
注意:装箱和拆箱都有比较明显的性能问题,一般用泛型进行解决(List<>)
值对象不可以为null
13.多态:内存一致,数据一样,但表现形态多种多样,具有可替换性、可扩充性、接口性、灵活性、简化性
14.abstract抽象:声明修饰符,可以修饰类、方法、属性,只有声明,没有逻辑,不需要在基类中实现此方法,只能在派生类处理,且当某个成员被声明为abstract时,整个class都要声明为abstract,派生类必须实现抽象类中所声明的所有抽象方法和抽象属性,不可以实例化
15.sealed密封类:防止类继承、防止派生类重写,不仅可用来修饰,同样可以修饰类成员
16.依赖注入和控制反转(从不同角度描述同一件事)
依赖注入(DI-Dependencies Injection)在类以及依赖项之间实现控制反转(IoC)的技术,实现类似系统配置、日志记录和选项模式等功能模块的解耦。
控制反转(IoC,Inversion of Control)把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
好处:低耦合性、标准性、可重复性
实现原理:依赖注入的实现原理是基于控制反转的概念,允许程序通过外部定义的方式来提供对象所需的依赖。
17.开闭原则(Open Close Principle)
对系统扩展是开放的,对修改是关闭的。
18.结构体(struct)与类(class)



19.静态类型语言和动态类型语言
静态类型语言会在编译的适合检查数据类型。
动态类型需要程序运行起来,数据类型才会被确定下来。
类型能否转换:强类型&弱类型

var:代替程序员自动对类型做出判断
dynamic:不运行到这一行都不确定这个类型,即通配类型
20.反射(Reflection):实例化独享但不使用new,不知道目标对象类型。在运行过程中查看或者使用元数据的过程,元数据(=数据的数据)保存在程序集(Assembly)中。
特点:不使用new关键词实例化,可以进一步的解耦
21.委托,即方法指针,仅仅指向方法的名称,不表示具体执行过程。是一种数据类型,所处理的方法引用过程的类型。委托必须与被委托的方法“类型兼容”。
22.Func&Action
Func:有返回值
Action:没有返回值
23.图标

24.自定义事件
event-in-general:事件完整声明
field-like:字段式声明
25.MVC与三层架构


三层架构基本原则:下层无法调用上层代码,跨层级之间无法互相访问。(代码解耦+数据隔离)

MVC优点:耦合性低,可复用性高,可维护性高
MVC缺点:定义不明确,结构复杂,数据流动效率低
26.ORM(Object-Relational Mapping),对象关系映射,一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。在面向对象的编程语言中,将关系型数据库中的数据映射成对象,以对象的形式展现,程序员把对数据库的操作转化为对这些对象的操作,简化了操作,提高了开发效率,但可能会引入一些性能开销,特别是在处理大量数据时。
c Sharp 中的ORM框架:Entity Framework。
27.Entity FrameworkCore 配置

28.MVVM(Model-View-ViewModel):软件架构设计模式,主要用于构建用户界面的应用,由Model、View和ViewModel三个核心部分构成。
29.索引器和迭代器
索引器:[],可以通过索引器查找到对应位置的数据。
迭代器:通过迭代器将数据遍历访问。头尾不指向数据。
30.面向对象思路的链式写法
//正常sql查询某用户家庭地址的邮编
select ZipCode
From User
Left Join Address ON User.id = Address.Userid
where User.id = $id
//链式写法(代码)
User.Address.ZipCode
2
3
4
5
6
7
31.REST(REpresentational State Transfer 表征性状态转移)
特点:无状态,面向资源,使用HTTP动词表示操作,HATOAS(超媒体即应用状态引擎)

适用于面向对象的数据处理,不适合处理面向过程的操作。
RESTful API:REST风格的API
RESTful核心:面向资源
32.RESTful的6条约束


33.HTTP请求方法与资源交互

put vs patch
put:对某个资源所有字段进行更新
patch:对某个资源所选的某几个字段进行部分更新

34.HTTP状态码



35.内容协商:允许客户端和服务器通过协商来决定相互之间的数据传输格式、语言等内容。
36.DTO(Data Transfer Object 数据传输对象):面向UI,实现了表现层和业务层的解耦
举例:只得到一个username的输出


37.IQeryable的逻辑和目的


38.Attribute

39.命令式语法和声明式语法
命令式语法:过程导向,适合处理对象关系和逻辑过程
声明式语法:结果导向,适合处理数据关系
40.匿名方法:创建一种没有名称的方法,随见随用,随用随弃。创建的同时会被调用,调用完成马上被废弃。
1)通过委托delegate
IEnumberable<string> filteredlist = customer.Where(delegate (string s){
return s.StartWith("A");//内联方法 inline
}))
2
3
2)通过Lambda表达式
IEnumberable<string> filteredlist = customer.Where(s=> s.StartWith("A");
41.Linq
1)查询:方法查询(对象) vs 结构化查询(like sql)
2)数据量化:Any、All、Contains
3)数据分组:group
4)数据分组连接:group join
5)数据聚合
42.进程和线程
线程:程序执行最小单元
前台线程:主线程结束但子线程依旧在运行,持续运行的子线程称为前台线程,一般比较重要,只有所有的前台线程执行完成后整个程序才可以被关闭。new Thread()创建的线程一般为前台线程。
后台线程:随着主程序的结束而结束。
43.多线程与异步、同步与异步
多线程处理并发操作,多个线程依次执行。通常用Thread。
异步处理并行操作,多个线程同时执行。通常用Task。
同步方法:程序调用某一个方法,需要等待执行完成后才进行下一步操作。
异步方法:程序调用某一个方法后,不做任何等待处理,在等待完成前返回该方法,继续执行接下来的操作。
异步的优点:减少客户端的等待时间,减少服务端的压力
44.异步方法的代码
声明:async
返回类型:Task、Task、void、IAsyncEnumerable
函数表达式:其中需要await
命名规范:Async结尾
async函数只能被async函数调用,async会改变函数结构,返回类型也会发生改变

异步控制的步骤:

45.Dispose
1)可以用来回收如数据库连接、文件读取、http长连接等无法托管在.net平台中的外部资源
2)使用时必须实现IDisposable接口
2)IDisposable接口需要配合using关键词才能完成生命周期的托管
46.JWT(Json Web Token)与Session
JWT作用是用户授权,替换了cookie,信息只需要保存在客户端,实现无状态登陆。
传统的Session登录时,服务器会保存登陆的session信息,session ID会通过cookie传递给前端,http请求会附带cookie,实现有状态登陆。


JWT优点:
1)无状态,简单、方便、完美支持分布式部署
2)非对称加密,Token安全性高
缺点:
1)无状态,Token一经发布无法取消
2)明文传递,Token安全性低(使用https可以解决)
46.有限状态机:一种用来进行对象行为建模的工具,主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。 (using Stateless;)
四要素:1.现态:指当前所处的状态
2.条件:也叫事件,触发一个动作执行一次状态迁移
3.动作:条件满足后执行的动作
4.次态:条件满足后要迁往的新状态
47.数据塑形:让客户端可以定制化选择性后端输出数据的技术。
方法:可以不用将全部的字段进行输出,根据传入的参数可以输出所需要的字段以及其数据。
48.HATEOAS(Hypermedia as the engine of application state),超媒体即应用状态引擎,打破了客户端与服务端之间的严格契约,REST服务本身的演化和更新也变得更加容易。
核心动态组件:Link(不属于restful资源)
herf:用户可以用来检索资源或者改变应用状态的URL
rel:用来描述资源和url的关系。
method:和此url需要的http方法。
响应参杂着资源以及操作,违反了restful定义。(内容协商)
49.媒体类型(MIME,Multipurpose Internet Mail Extensions)是一种标准,用来表示文档、文件或字节流的性质和格式。
通用结构:type(独立类别)/subtype(细分后的子类型)

自定义媒体类型(Vendor-specific media type),供应商特定媒体类型
结构(举例):application/vnd.mycompany.hateoas+json
vnd:Vendor的缩写,表示供应商
mycompany:自定义标识,公司名
hateoas:返回的响应要包含的超媒体链接
+json:输出的数据结构