零散知识点

1.值类型和引用类型的区别程序员

      1. 值类型的变量赋值时是将真实数据的副本付给变量,而引用类型则是将对象的引用付给变量, 这会产生多个多个变量同时指向一个对象实例
      2. 值类型定义时,会在堆栈上分配内存,引用类型会在堆上分配内存
      3. 全部的值类型都有共同的基类:System.ValueType.全部值类型都已经实现了类容的比较equals() 方法,而引用类型在没有重写Equals()方法的状况下,任然采用引用比较。

2. 堆和栈的区别算法

    1. 栈由操做系统自动分配和释放,通常用于存放函数的参数和局部变量的值。堆有程序员分配和释放,若是程序不主动释放,可在GC进行回收,或在程序结束后由操做系统回收。
    2. 栈使用的是一级缓存,在调用时被分配空间,调用完毕当即释放;

堆使用的是二级缓存,生命周期由垃圾回收算法来决定。c#

3.结构和类的区别windows

  1. 结构是值类型,类是引用类型 。
  2. 结构里的成员都是public,类有其余的访问限定符
  3. 类是显示实物的一种抽象,结构包含不一样类别数据的一种包装。全部类型只包含一些数据时,用结构比较合适。
  4. 结构不能继承,类能够。
  5. Sealed修饰类有什么特色

Sealed修饰类,表示该类为密封类。不能从它派生出其它类。全部sealed和abstract不能同时限定类缓存

         6.结构不能定义不带参数的构造函数,类能够。由于运行库会提供隐式构造方法,把值类型初始成0,把引用类型初始成null.即便提供了带参数的构造函数,也不能绕过默认构造函数;闭包

         7.结构不能直接给字段附默认值;并发

4.  类的访问限定符异步

        Partial: 类分红两个文件,分别在不一样的文件中ide

       Public : 该类的访问不受限制。函数

       Internal:同一个assembly的文件间的才可引用,常见的用途是基于组件的开发。

成员的访问限定符

  Public:访问不受限制

  Private:只能在本类中访问

  Protected:在本类或其子类中能够访问

  Internal:同一程序集中

六、面向对象的3个基本特征

  1. 封装:把客观的事物封装成抽象的类,类能够吧本身的数据和方法公开给可信的类或对象进行使用,对不可信的进行信息隐藏;
  2. 继承:
  3. 多态:有重载和覆盖两种,覆盖是重写父类在方法。重载是相同方法名,不一样参数或返回值。

7.。net托管资源与非托管资源

  托管资源:就是由clr分配和释放 的资源,有两种类型,一是普通托管,如int,float等值类型对象;二是非普通托管资源,继承了IDISPOSE接口在类的实例对象。此类资源在被GC回收时要经历两步,会下降系统性能,所以在实现dispose方法时要注意手动清理。

  非委托资源:就是不受clr管理的对象。如windows内核对象,File,dbConnection,Socket,com对象等。

继承Idispose接口的类的对象不是非委托 资源,非委托资源没法在程序中自定义。

若是在程序中使用到了非委托资源就要在程序中显示地释放资源,方法是让类型继承Idispose接口,

//自定义非普通托管资源
Class MyResource:IDispose
{
    Public void Dispose(){}
}

Public class SampleClass :IDispose
{
  //非普通托管资源
   MyResource myResource=new MyResource();
   //非委托资源
  Private IntPtr nativeResource=Marshal.AllocHGlobal(100);
//普通委托资源
Private String name=”bany”;
  Private bool disposed=false;

  Public void Dispose()
{
  //必须为true,显示释放全部资 源
   Dispose(true);
//通知垃圾回收机制再也不调用终结器(析构器),也就是GC再也不调用 ~SampleClass()
  GC.SuppressFinalize(this);
}

//防止程序员显示调用dispose()来回收资源,这时可由GC来回收并释放非托管资源。
//析构函数中不容许释放托管资源,由于Gc在调用析构函数前可能已经释放非托管资源
~SampleClass()
{
  //必须为false
  Dispose(false);
}

//若是子类继承并实现了本身的dispose方法,必须调用父类的dispose() 来释放父类中的资源。调用 base.Dispose(disposing);
Protected virtual void Dispose(bool disposing)
{
  If(disposed) return ;
  If(disposing)
  {
//清理非普通类型的托管资源
If(nyResource!=null)
{
myResource.Dispose();
myResource=null;
}
  }
//清理非托管资源
If(nativeResource!=IntPtr.Zero)
{
Marshal.FreeHGlobal(nativeResource);
nativeResource=IntPtr.Zero;
}
Disposed=true;
}
}
View Code

 

8. 抽象类和接口

相同点: 

       1.都不能被实例化;

       2.都包含的未实现的方法;

      3. 派生类必需要实现未实现的方法,接口是全部定义的方法,抽象类是未定义的方法;

       4.他们都是实现扩展的一个手段。

不一样点:

      1.抽象类是对类的不可变行为的抽象,这些修为能够在抽象类中定义和实现。接口是定义的一组行为规范,不能有实现和私有字段。

       2.一个类能够实现多个接口,但只能扩展一个父类。

      3.接口不具有继承的任何特色,只承诺能被调用的方法。

       4.若是抽象类实现接口,能够将接口的方法映射到抽象方法而没必要实现,让子类去实现。 

   抽象类和接口的使用: 

     1.尽可能避免使用继承来实现组建功能,而是用黑箱复用,即对象组合(把另外一个类的对象组合到类中来实现功能组合);

    2.接口污染:接口应具有专注功能性,而不是多功能的;

    3.oop原则:把可变的和不可变的分离;抽象类和接口都是定义不可变的。

     4.若是建立的功能是在大范围的全异对象间使用,则使用接口;

    5.若是要设计大的功能单元,则用抽象类,若是在全部实现间提供通用的功能实现,则用接口。

    6.抽象类主要用于关系密切的对象; 接口用于为不相关的类提供通用功能;

9.类的设计原则

  1. 开闭原则:在扩展方面开放,在修改方面封闭。多用接口、抽象类、多态等技术来设计。

         实现方法:把不变的部分抽象成接口;

         接口要注意最小功能实现;

         模块之间的调用要经过接口进行,这样即便实现层发生变化,也无需修改调用层的代码;   

 

  2.替换原则:子类能够替换父类,并出如今父类出现的任何地方。

  3.依赖原则:依赖关系尽可能依赖接口和抽象类。具体类只负责业务实现,修改具体类不会影响整个业务的依赖关系。

           高层模块不该该依赖于低层模块,两者都应该依赖于抽象。

            抽象不该该依赖于细节,细节应该依赖于抽象

  4. 接口分离原则:使用多个专门的接口要比使用单一接口涵盖多个功能好。

  5.单一职责:类在。一个操做类只完成一种职责。

设计时如何划分职责:可分为实体类,操做类,边界类;

  一种职责:引发该类发生变化的一个缘由;

  操做类:控制类有效将业务逻辑独立于实体数据和边界控制,专一于处理业务逻辑,控制类会将特有的操做和实体类分离,者有利于实体类的统一化和提升复用性。

 10. 静态类和静态构造函数

静态类:该类包含的全部属性和方法都是静态的,该类就是静态类,不能建立静态类的实例,因此不存在构造函数。使用静态类能够检查用户是否不经意的建立的类 的实例。在功能上与使用私有静态构造函数建立的类相同。

构造函数:1.编译器会给没有定义构造函数的类建立默认的不带参数的构造函数,它只能把全部的字段成员初始化为标准的默认值。

                   2.若是类已提供了带参数的构造函数,编译器就会不自动提供默认的构造函数。

                   3.能够把构造函数定义为private /protected ,这样就不能在外部实例化该类,这样不相关的类就不能访问她了。

 静态构造函数:类有一些静态的字段或属性,须要在第一次使用类以前,在外部源中初始化这些静态字段和属性。

                      1.静态构造函数没有访问限制符,其它c#代码不会调用它,它只是在第一次调用类的任何成员以前会执行它。

                      2.静态构造函数不能有任何参数,一个类只能定义一个静态构造函数。

 

 11.扩展方法

     1.一个类没有的源代码,须要给类添加方法。

    2.扩展方法是个静态方法,需定义在静态类中。第一个参数是要扩展的类型,用this关键字修饰。

12 . 接口继承和实现继承:只继承接口的函数签名,后者还继承方法实现。

  虚方法:(virtual)能够在如何派生类中重写该方法。

13.派生类的构造函数

 14.泛型类型

    默认值:因为不能把null 赋值给泛型类型,在给泛型类型赋默认值是用default 如: T doc=default(T);

 

 15:委托

      委托是实现对方法的引用,能够把方法当参数,进行传递。主要应用场景是实现对同步方法的异步调用(invoke,beginInvoke,endInvoke),也实现对控件的异步或并发访问。它是经过使用线程池中的线程来进行异步调用。

     2.多播委托包含一个逐个调用的委托集合,若是经过委托调用的其中一个方法出现异常,整个迭代就会终止。为解决这个问题,委托添加了GetInvocationList()方法,用来遍历委托对象列表。

     3.匿名方法:不用单独定义仅有委托引用的方法;匿名方法中不能包含跳转语句(break,  goto,continue)跳转到匿名方法的外部,反之,匿名方法外部的跳转语句不能跳转到匿名方法内部;不能访问在匿名方法外部使用的ref和out参数。

    4.lambda表达式。c#3.0用来替代匿名方法,给委托赋予实现代码。lambda运算符=>  ,左边为参数列表,右侧为实现代码;

    5.闭包:经过lambda表达是能够访问表达式块外部的变量;

相关文章
相关标签/搜索