Skip to content

Latest commit

 

History

History
66 lines (47 loc) · 5.52 KB

dotNet.md

File metadata and controls

66 lines (47 loc) · 5.52 KB

.Net相关知识

.Net Standard, .NetCore , .Net Framework 之间的区别

  1. .Net Standard 是个标准,规范(定义了一系列必要的方法,但他不提供实现)
  2. .Net Core 他是在.Net Standard基础上增加了实现以及一些特有方法,他是跨平台高性能的
  3. .Net Framework 也是在.Net Standard基础上增加了实现以及一些特有方法,但仅可以运行在windows系统中或使用mono运行在linux中
  4. .NetCore与.NetFramework实现.Net Standard中的同一方法,他是内部实现可能是不同的
  5. 如果我选择写一个.NetCore与.NetFramework公用的类库,则采用.Net Standard来编写公共类库

异步编程与多线程

  1. 异步不等于多线程,异步不会提升单个任务的处理速度,他只是提高了处理的并发量,也不会自动放到新的线程中去执行,除非手动(使用await Task.Run)
  2. 异步涉及线程切换,完全由线程池调度,在await调用的等待期间,可能会把当前线程返还给线程池,调用完毕之后,会重新取一个线程来执行后续代码(这个线程可能是之前的线程也可能是新的),线程切换会导致一些资源切换,性能不一定好
  3. 异步会将代码中的局部变量封装到一个类中作为成员变量。并且会在next方法中通过switch case来执行(状态机模式),所以他会多生成一个类,运行效率肯定没有普通方法高,可能也会占用很多线程
  4. 优化:如果在当前方法A内,如果只是转发异步方法B的返回值,不需要拿到这个异步方法B的值去做处理,则可以直接返回异步方法B的Task<>,而不用将A方法async,也不用await B
  5. 异步方法中暂停,不要使用Thread.Sleep(),使用await Task.Delay();

委托,Lambda,Linq

  1. 委托就是可以指向方法的类型,可以将方法作为参数传递,一般都用无返回Action<>(),有返回Func<>()
  2. 委托也可以指向匿名方法,匿名方法可以写成lambda表达式

控制反转,依赖注入

  1. 依赖注入简化模块的组装过程,降低模块之间的耦合度。更利于单元测试
  2. 控制反转,他不需要创建需要的对象,也不关心这个对象,他只需要知道他需要什么对象。两种实现方式:服务定位器,依赖注入。
  3. 不要再长生命周期的对象中引用比他短生命周期的对象。

IQueryable与IEnumerable

  1. IQueryable相当于把查询翻译成SQL语句,对数据库服务器端进行筛选查询。IEnumerable是对内存中数据进行筛选查询。

TransactionScope

  1. 可以讲两个不同事务合并成一个事务
  2. TransactionScope可以讲不通操作合并到一个事务,例如文件读写与数据库操作两个不同的操作
  3. 可以与IAsyncActionFilter结合使用,将不同Action过滤器合并到一个事务里面

GC

自动找到并且释放不再使用的内存空间机制,称为垃圾回收机制,Garbage Collection简称GC

栈空间

每个线程都有独立栈空间,用于保存调用函数的数据

堆空间

堆空间就是程序中一块独立的空间,堆空间分配的数据可以被程序中所有函数和线程访问,并且不回随函数返回与线程结束而释放 例如使用new关键字时,就是在分配堆空间

  1. 值类型的对象本身存储值,引用类型的对象本身存储内存地址,他的值存储在内存地址指向的空间中
  2. 引用类型的地址存储在栈空间,值存储在堆空间
  3. 值类型的对象会根据定义的位置隐式分配与释放
  4. GC回收的是堆空间中不在使用的数据(栈中没有地址指向他们的),栈空间是跟随函数释放而释放
  5. GC主流方式“标记并清除”,根对象包括:各个线程栈空间上的变量,全局变量,GC句柄,析构队列中的对象
  6. 静态类中的静态对象是在程序结束的时候去回收
  7. 应用类型的对象分三代,0代,1代,2代。小对象在0代,大对象在2代。一轮GC后,0代对象如果还存活,他会升级到1代,如果继续存活,升级到2代,会停留在2代
  8. 反复指向分配与回收造成,会导致产生很多空余空间,这些空余的空间称为碎片空间。压缩机制,可以将碎片空间合并到一起,可以让堆可以分配更大对象。需要修改栈空间与堆空间
  9. 根据引用类型的对象值的占用空间来区分是大对象(大于等于85000字节),小对象。大对象与小对象分配的堆区域不同。应为他们处理大堆小堆时间不一样,移动大对象成本很高,压缩机制默认只在小对象堆中启用
  10. 固定对象:引用类型传递给非托管代码必须创建固定类型的GC句柄,并且保持这个句柄存活到非托管代码调用结束。创建了固定类型GC句柄的对象就称为固定对象
  11. 析构函数:如果对象不在存活,但定义了析构函数,那么对象会添加到析构队列中,并标记存活,GC本轮就不回回收这个对象。但GC结束后会执行析构函数,然后在下一轮GC被回收掉。一般在非托管类型中定义这个
  12. STW:让GC处理以外的线程全部停止
  13. 工作站模式与服务器模式:工作站模式:内存占用小和桌面程序,提供更短相应时间。服务器模式:内存占用大,服务程序,提高大吞吐量。
  14. 普通GC:会导致更长的STW时间,但消耗资源比较小,支持压缩处理。 后台GC:每次STW时间会短一点,但次数和消耗会增多,并且不支持压缩处理。