C#/.net从业必要技能

C#/.net从业技能(一)

以下是我整理.net从业的必要技能

必要技能

序号 必要技能
1 C#语言相关
2 设计与架构
3 岗位相关
4 数据库
5 线程
6 语言

C#语言相关

序号 必要技能
1 .net 平台基础知识
2 C#类型基础
3 C#的面向对象
4 内存管理和垃圾回收
5 C#数据结构
6 委托与事件
7 泛型
8 LINQ相关
9 反射
10 C#的新特性

平台基础知识

【1】NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。

  • CLR-Common Language Runtime 意为公共语⾔运⾏库,它是⼀个可由多种不同编程语⾔使⽤的运⾏库,只要是⾯向 CLR 的编译器编译的编程语⾔都被 CLR ⽀持。
  • IL-Intermediate Language(IL),意为中间语⾔,⾯向 CLR 的编程语⾔被编译为IL代码,IL代码也被称为托管代码,它是与 CPU ⽆关的机器语⾔,是⼀种⾯向对象的机器语⾔。每⼀个 IL代码⽂件被称为托管模块(managed module)。托管模块是⼀个32位或是64位可移植执⾏体⽂件,它们需要CLR才能执⾏。每个托管模块带有相应的元数据(metadata),元数据描述模块中定义的内容,⽐如类型及成员、导⼊的类型及成员。每个托管模块由操作系统头信息、CLR头(记录版本、⼊口⽅法等)、元数据、IL代码(CLR在运⾏时将IL编译成本地CPU 指令)。 ⼀个.NET程序集是由⼀个或者多个托管模块和资源⽂件组成,程序集是⼀个或是多个托管模块的逻辑分组,是最⼩的可重用、安全性及版本控制单元。
  • JIT-just-in-time(JIT),意为CLR对IL代码进⾏即时编译的过程,CLR拥有进⾏JIT过程的编译器(JITComiler),它将要调⽤的IL 代码编译为本地 CPU 指令。

【2】引用类型和值类型
CLR⽀持引⽤类型和值类型。 引⽤类型总是从托管堆上分配,C#的new操作符会返回对象的内存地址。结构与枚举都是值类型,与引⽤类型相⽐,值类型是⼀种轻量级的类型,值类型实例是在线程的堆栈上分配,值类型不需要内存指针,不需要垃圾收集处理。所有类型 都是System.Object派⽣,所有值类型都是由System.ValueType抽象类派⽣。
拆箱是获取已装箱对象各个字段的地址(拆箱关键),并将已经装箱的对象的字段值复制到新的值类型变量的字段。拆 箱时只能将对象拆箱为它装箱时的类型。
【重要提示】⼿动控制装箱的速度将⽐编译器装箱的速度快。如:

//编译器装箱
 Int32 v =5;
 Console.writeLine({0}{1}{2},v,v,v);
 //⼿动装箱
 Int32 v=5;object o =v;
 Console.writeLine({0}{1}{2},o,o,o)

【3】面向对象的三大特征五大原则

  • 封装性
    每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码。
  • 继承性
    继承可以使用现有类的所有功能,并在无须重新编写原来的类的情况下,对这些功能进行扩展。
  • 多态性
    包括方法的重载和重写。

【4】接口和抽象类的区别和联系

  • 接口
    指对协定进行定义的引用类型,其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员。
    1、接口存在的意义是为了实现多态;
    2、接口中只能包含方法(属性、事件、索引);
    3、接口的成员不能有任何实现;
    4、接口不能被实例化;静态类、抽象类也不可以被实例化;
    5、接口的成员不能有访问修饰符(默认为public);
    6、实现接口的子类必须将接口的所有成员函数实现;
    7、子类实现接口的方法时,不需要任何关键字,直接实现即可。(抽象类、虚方法需要加override)

  • 抽象类
    在面向对象过程中,所有的对象都是类描绘的,反过来,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类
    1、抽象方法只能出现在抽象类中,但是抽象类中可以包含普通方法。
    2、在父类中定义的抽象方法不能实现。
    3、抽象类不能实例化(也就是不能new出来)。
    4、抽象类与抽象方法需要添加abstract关键字。
    5、子类实现父类的抽象方法时,需要添加override关键字。
    6、如果抽象类的子类不是抽象类,那么子类中必须重写父类抽象类的所有抽象方法。

  • 相同点
      1.不能实例化;
      2.包含未实现的方法声明;
      3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)

  • 不同点
      1.接口可以多继承,抽象类不能实现多继承。
      2.接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员
      3.接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念
      4.接口支持回调,抽象类不能实现回调,因为继承不支持。
      5.接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法
      6.接口可以作用于值类型和引用类型,抽象类只能作用于引用类型(例如:Struct只能继承接口)
      7.抽象类应主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能
      8.接口着重于Can—Do关系类型,抽象类则偏重于IS—A式关系。
      9.接口多定义对象的行为,抽象类多定义对象的属性。
      10.如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类
      11.接口对应是面向对象编程思想的重要原则:面向接口编程

【5】内存管理和垃圾回收机制
值类型保存在Stack上,随着函数的执行作用域执行完毕而自动出栈,所以这一类型的资源不是GC所关心 对象。GC垃圾回收主要是是指保存在Heap上的资源。
.NET的GC机制有这样两个问题:
  首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。
  第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。
  GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
  托管资源 : 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。
  非托管资源:非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标 等。这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源。

  • 声明析构函数作为类的成员(析构函数没有返回值,没有参数,没有修饰符)【不建议

  • 在类中实现System.IDisposable 接口  C#/.net从业必要技能_第1张图片
    【6】Array、ArrayList、List

  • Array(数组)在内存中是连续存储的、所以它的索引速度是非常快的、时间复杂度为O(1)、而且它的赋值/修改/获取元素也是非常简单的。

  • ArrayList大小会根据需要动态增加的数组、实现了IList接口、可以方便的对数据进行添加、插入和删除。ArrayList会把插入的数据都当做object类型来存储、在操作数据的时候可能会因为类型不匹配而出现异常、它是非类型安全的对象。由于存储的是object类型、在使用的时候进行类型转换、会造成装箱拆箱、从而损耗性能。

  • 由于泛型List是强类型、编译器会验证类型安全。这样就避免了类型的不安全、以及数据强制转换导致装箱拆箱损耗性能。

  • Dictionary 源码解析 是HashTable的泛型实现。

  • HashTable: 表⽰键/值对的集合,这些键/值对根据键的哈希代码进⾏组织。

  • Stack:表⽰对象的简单的后进先出⾮泛型集合。Stack 的容量是 Stack 可以保存的元素数。Stack 的默认初始容量为 10。 向 Stack 添加元素时,将通过重新分配来根据需要⾃动增⼤容量。Stack常被当作循环缓冲区。

  • Queue(队列):是表⽰对象的先进先出集合,与Stack相反。队列在按接收顺序存储消息⽅⾯⾮常有⽤,以便于进⾏顺 序处理。此类将队列作为循环数组实现。存储在 Queue 中的对象在⼀端插⼊,从另⼀端移除。Queue 的容量是 Queue 可以保存的元素数。Queue 的默认初始容量为 32。向 Queue 添加元素时,将通过重新分配来根据 需要⾃动增⼤容量。

【7】新特性及其引入该特性实际意义

  • 委托与事件、反射
    委托是.NET中的回调机制。将一个方法绑定到一个委托时,C#和CLR允许引用类型的协变(covariance)和反协变(contra-variance)。协变是指一个方法能返回一个从委托的返回类型派生出来的类型。反协变是指一个方法的参数类型可以是委托的参数类型的基类。但协变对于返回值类型或void的方法不适用。
    关键字“event”是个修饰词,在绝⼤多数的情形中,被指定为委托(delegate)的对象和被指定为事件(event)的对象是可以互换的。然⽽,事件还有特殊之处:
    ● 事件就像⼀个委托类型的字段。该字段引⽤了⼀个代表事件处理器的委托,这些处理器是被添加到事件上的;
    ● 事件只能在声明它的类中被调⽤,⽽所有能见到委托的地⽅都可以使⽤委托;
    ● 事件可以被包含在接口中⽽委托不可以;
    ● 事件有可被重写的Add和Remove存取(acccessor)⽅法;
  • 泛型(generic)是CLR与编程语⾔提供的⼀种实现“算法重⽤”的机制。泛型对象设计⽤于管理在类型上成家族的集合。
    1、使用接口方法变为强类型。
    2、泛型接口在操作值类型时,会减少装箱操作。
    3、类可以实现同一个接口若干次,只要使用不同的类型参数。
  • LINQ 扩展类型、Lambda表达式、闭包
    语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称,比如涵盖:SQL 数据库查询、XML 文档查询、List对象查询、Array对象查询、String对象查询……。 借助 LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。
  • 动态语言运行时
  • async/await

你可能感兴趣的:(笔记,概念,C#开发)