.NET框架准备

重温C#

  1. 类、继承、接口
    • 类:定义对象结构的一个过程
    • 继承:任何一个类都可以从另外一个类继承,这个类拥有它继承的类的所有成员。
    • 接口:用来定义程序的协议,它描述可属于任何类或结构的一组相关行为。
  2. 字段、属性、常量、枚举
    • 字段:一个成员,它表示与对象或类关联的变量。
    • 属性:属性是实体的描述性性质或特征,具有数据类型、域、默认值三种性质。
    • 常量:常量是在编译时已知并在程序的生存期内不发生更改的不可变值。
    • 枚举:一个被命名的整型常数的集合。
  3. 方法、委托、事件

    • 方法:某个对象的行为
    • 委托:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。
    • 事件:基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件
      使用事件时的注意事项:
      1. 多播事件注意内存溢出:如果写的事件是可以被多个对象监听的,那么在释放对象时一定要及时清理你所暴露出来的事件。
      2. 移出时的判断:对事件进行移出时,一定要记住先判断,然后再进行移出操作。

    异步领域事件与事件回溯:事件的作用很大,在复杂的业务场景中,我们会使用异步事件来保存领域状态,必要时用回溯事件值来还原领域模型。而使用异步保存领域模型的状态值也恰恰可以给高并发的系统架构带来很好的性能提升,将同步与异步进行读写分离。
    由于是采用异步的操作方式,所以可以将对事件的具体逻辑处理放在一个相对平稳的运行环境中,然后再进行高并行异步的数据处理,类似于EDA(Event Driven Architecture)。这种应用场景多半在对核心业务进行操作跟踪时使用,效果很好。

  4. 泛型、协变/逆变、类型推断
    • 泛型:泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。
    • 协变和逆变:
      • 如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持协变的
      • 如果某个参数类型可以由其基类替换,那么这个类型就是支持逆变的。
    • 类型推断:类型推断使用var关键字。编译器可以根据变量的初始化值“推断”变量的类型。
  5. 扩展方法:扩展方法是让我们在不改变类原有代码的情况下动态地添加方法的方式,这给面相对象设计、模块设计带来了质的提升。
  6. 部分类、部分方法
    • 部分类:使用partial关键字可以声明部分类, 部分类的作用是可以在多个文件中声明同一个类, 主要用于类比较大的时候进行拆分。
    • 部分方法:部分类也可以定义部分方法。部分方法在部分类中定义,但没有方法体,在另一个部分类中执行。
  7. 特性、元数据
    特性可以理解为附加在类型上的一段数据属性,可以称为类型的元数据。强大的是这些元数据可以在运行时动态获取。特性可以说是框架设计中必须要使用的一个技术点,因为它是契约式设计和AOP设计的基础。它帮我们将复杂的业务逻辑与基础设施分隔开来,而在运行时又动态地结合在了一起。
    参数元数据通常用来作为上游对下游的约定,也就是说用来获取参数特性功能点是在方法的调用端,然后根据该方法所用的参数元数据来约定该参数。
  8. 反射、代码对象模型、动态编译、动态缓存
    反射是在运行时动态获取.NET类型元数据的功能。
    在运行时,.NET会将我们定义的每一个类型保存一份元数据表,这就是我们要在运行时动态获取一个类型的元数据的基础元数据字典。而这个字典是字符级别的定义,也就是说动态反射获取类型元数据时进行字符级别的查找匹配。
    这是我们通常所说的反射将会影响性能的地方。一贯的解决思路是:在运行时动态生成代码,然后再动态编译,最后再动态缓存起来。
  9. 创建型——工厂模式、工厂规则注入、委托工厂
  10. 行为型——观察者模式、基于事件的观察者
  11. 结构性——桥接模式、扩展方法
  12. 编码时应注意防御性、稳定性和性能
    1. 防御性:不应该总是那么相信目前正在调用的接口或返回的数据结果正是我们所期望的值,而要加以判断。判断时使用反向判断,能使代码变得美观,而且向业务靠拢。
    2. 稳定性:避免直接返回NULL。在靠近外部的方法中尽量不要返回NULL,而在靠近领域模型的代码时可以返回NULL。
    3. 空对象模式和扩展方法的NULL验证:空对象模式是用来给原本为NULL的对象赋一个具有NULL意义的实例,然后用户的引用始终有一个实例,而这个实例是表示没有任何值的空实例,主要用来做判断。
    4. 注重性能的编码方式
      1. 在对象使用时再实例化
      2. 在对象不使用时即时设置为NULL
      3. 使用IDisposable接口来声明有重要资源需要及时释放
  13. 单元测试、可测试性代码、持续重构
    单元测试并不是只为了验证你目前所写的代码有没有问题,它更为重要的作用是,你一次编写好的测试用例是否可以在日后随时随地地运行,来验证你本次所修改的代码是否影响到了以往的业务逻辑。
  14. 第三方库是可插拔的、依赖库的版本
    1. 依赖抽象接口
      将需要以来的第三方库抽象成一个接口,内部只使用这个抽象接口,断开与第三方库的直接依赖。
    2. 依赖库的版本
      在对第三方库进行动态加载时需要做版本约束性检查,同时需要将每个依赖版本的信息都文档化,以便查询目前正在使用的版本。

备注

.NET的GC算法用的并不是“引用计数”,而是“标记与清除”,所以不必担心设置为NULL的对象是否会被即时回收。“标记与清除”算法是从应用程序的根对象开始计算一个对象可达树。显然,如果是不能够被访问的对象就会被DC认为是垃圾,将被回收掉。而“引用计算”算法,是计算每个对象的引用计数,所以哪怕这个对象有任何一个引用关系存在,都不会被释放掉,这种算法经常会导致内存泄露。而GC的“标记与清除”算法不会管你的引用关系,哪怕有一群对象彼此互相连接,但是这群对象是孤立的,从应用程序域根对象开始计算可达树,只要中间断开了与这群对象的可达,那么这群对象同样会被GC回收。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值