代码改变世界

Net-基本概念和原理

2012-08-26 16:22  图安  阅读(547)  评论(0编辑  收藏  举报

CLR

CLR是公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。内存管理、程序集加载、安全性、异常处理小、线程同步。

WPF
WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面

WCF
Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口 (Windows通讯接口),它是.NET框架的一部分,由 .NET Framework 3.0 开始引入,与WPF及 WF 并行为新一代 Windows 操作系统以及 WinFX 的三个重大应用程序开发类库。
WCF是对于ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等技术的整合
WCF最基本的通信机制是SOAP(Simple Object Access Protocol 简易对象访问协议)

委托
委托是用途类似于 C++ 中的函数指针的引用类型。它们用于 .NET Framework 中的事件处理程序和回调函数。与函数指针不同,委托是安全、可验证和类型安全的。委托类型可以表示任何具有兼容签名的实例方法或静态方法。

接口

接口定义用于指定“可以执行”关系或“具有”关系的协定。接口通常用于实现某种功能,如比较和排序( IComparable 和 IComparable < T > 接口)、测试相等性( IEquatable < T > 接口)或枚举集合中的项( IEnumerable 和 IEnumerable < T > 接口)

接口可具有属性、方法和事件,所有这些都是抽象成员;

也就是说,虽然接口定义这些成员及其签名,但每个接口成员的功能由实现该接口的类型定义。这意味着实现接口的任何类或结构都必须为该接口中声明的抽象成员提供定义。接口也可以要求任何实现类或结构实现一个或多个其他接口。

对接口有以下限制:

  • 接口可以用任何可访问性来声明,但接口成员必须全都具有公共可访问性。

  • 接口不能定义构造函数。

  • 接口不能定义字段。

  • 接口只能定义实例成员。它们不能定义静态成员。

每种语言都必须提供映射规则,将实现映射到需要该成员的接口,因为多个接口可以使用同一个签名声明成员,而这些成员可以分别具有单独的实现。

 


 C#中接口与抽象类的区别

个人理解:接口是一种行为的集合。抽象类是一种族的聚集。
 
在C#中接口与抽象类有很多共同点,但是对于一些刚加入C#队伍的人来说,可能还不够清楚,最近在网上看了下面的一个说法,感觉挺好的,就共享给大家看一下:

接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 
而类是负责功能的具体实现! 

在类中也有抽象类的定义,抽象类与接口的区别在于: 
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。 
但接口是一个行为的规范,里面的所有东西都是抽象的! 
一个类只可以继承一个基类也就是父类,但可以实现多个接口 


PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使 用好处,最直接的就是设计原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使 用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个 “不能够”是指在规范原则上不应该这么做!

 

应用程序域

 

操作系统和运行时环境通常会在应用程序间提供某种形式的隔离。
例如,Windows 使用进程来隔离应用程序。为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。

应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行时宿主创建,运行时宿主负责在运行应用程序之前引导公共语言运行时。

APPDomain


.NET Framework 中的类型

 
 

.NET Framework 中的所有类型不是值类型就是引用类型。

值类型是使用对象实际值来表示对象的数据类型。如果向一个变量分配值类型的实例,则该变量将被赋以该值的全新副本。

引用类型是使用对对象实际值的引用(类似于指针)来表示对象的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或指向)原始值。不创建任何副本。

.NET Framework 中的通用类型系统支持以下五种类别的类型: 结构  枚举 接口 委托

 

 


 

中间语言(IL):.net程序在第一次编译后形成CLR头,元数据和中间代码;

在实施运行或者部署时,将经过第二次编译,编译的结果是在CLR中可执行的机器代码。

该机器码会缓存起来,若是第二次调用便会省去即时编译过程。其中第一次生成的便是中间语言,一种类似于汇编语言的代码,运行时会JIT成本地CPU指令。

 


 

GC是什么,简述一下GC的工作方式

垃圾回收(garbage collection)
Dot Net的垃圾回收可以分为两个步骤,第一步进行“标记”,垃圾回收器假设所有的对象都是垃圾,然后开始遍历每一个“根”(根包含指向引用类型对象的一个指针,值类型对象永远不会被认为是一个根),如果发现一个根引用了一个对象(非NULL),就对对象进行标记。没有被标记的对象被认为是垃圾。第二个阶段就是“压缩”,其实就是将后面的对象移动到已经成为垃圾的对象位置,使得原来的托管堆更为紧凑。从而释放了托管堆。
GC类中的方法影响何时对对象进行垃圾回收以及何时释放对象所分配的资源。此类中的属性提供以下信息:系统可用内存总量、分配给对象的内存的周期类别(代)。
GC跟踪并回收托管内存中分配的对象。垃圾回收器定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,垃圾回收会自动进行。或者,应用程序可以使用 Collect 方法强制进行垃圾回收。
垃圾回收由以下步骤组成:
GC搜索托管代码中引用的托管对象。
GC尝试完成没有被引用的对象。
GC释放没有被引用的对象并回收它们的内存。
在回收期间,如果GC在托管代码中找到对某对象的一个或多个引用,则不会释放该对象。然而,GC不识别非托管代码中对对象的引用,因此,除非明确禁止,否则它有可能释放非托管代码中以独占方式使用的对象。KeepAlive 方法提供一种机制,该机制可防止垃圾回收器回收在非托管代码中仍使用的对象。