1.一步一步学c#(一):.NET体系结构(知识点)

11/25/2015来源:ASP.NET技巧人气:1451

.C#和.NET关系

    1. 首先C#语言有两个很重要的方面:第一它是为了Microsoft的.NET Framework的结合而设计的,其次它是一种为问题而设计解决问题的方法的语言,它有很多相似语言的长处。

C#本身就是一种语言,它不是.NET的一部份,两者各有所长,但两者是一起使用。

 

2.什么是.NET

        .NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的,联通的,适应变化的,稳定的和高性能的。.NET应用它是一个运行于。NET

Framework之上的应用程序。(更精确的说一个。NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时 Common Language Runtime之上的应用程序)。

二.公共语言运行库

    1. .NET Framework的核心是公共语言运行库(CLR)或.NET运行库,一般将CLR控制台下运行的代码称为托管代码(managed code).

在.NET中完成编译的两种方法:1·将源代码转换为Microsoft中间语言。2·利用CLR把IL编译成平台专用代码。Microsoft中间语言的理念:低级语言,语法简单,(语法简单表现在它使用数字代码而不是文本代码),能快速的转换为本地机器码,对于代码来说这种设计具有重要的有点:平台无关性,提高性能和语言的互操作性。

1>.平台无关性:包含字节码指令的同一文件可以放在任何一个平台中,运行时后面的编译就可以很轻松的完成,这样一来平台上运行的代码就是特定的,换一句话说,就是编译成中间语言时同时获得了.NET的平台无关性。和它相同的是编译java时字节码就会获得Java的平台无关性。

2>提高性能:因为IL总是即时编译的(JIT编译),之前的Java在运行应用程序时会把字节码转换为内部可执行代码,这样的过程会导致性能的损失,而JIT编译是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。JIT编译器不是把整个程序一次性的编译完,如果这样一次性编译完就会浪费很多的时间,而是只编译被调用的那部分。编译代码过一次后,得到的本地可执行程序就会储存起来,知道退出该程序为止,这样在下次运行此代码时,就不用重新编译了。

3>语言的互操作性:IL功能:支持平台无关性,还支持语言互操作性(能将任何一种语言编译为中间语言)编译成语言的代码和其他语言编译之后的代码进行互相操作。

 三.中间语言

     中间语言的特征:·面向对象和接口的支持·值类型和引用类型之间的显著差异·强数据类型化·使用异常来处理错误·使用特性(attribute).

     使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件但此时编译出来的程序代码并不是cpu能直接执行的机器代码,而是
中间语言(IL)的代码.

使用中间语言的优点:1.可以实现平台无关性,即与特定的cpu无关。2.只要把.NET框架某种语言编译成IL代码,就实现.NET框架中语言之间的交互操作。

1.COM接口理念:提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。

另外中间语言还引入了接口的概念

另外中间语言还引入了接口的概念用.NET建立的接口与COM接口不同,它不用支持任何COM基础结构比如说:它们不是派生自IUnknown,也没有对应的GUID,但它们与COM接口共享同一理念。

语言互操作性的含义:是用一种语言编写的类应能直接与用另一种语言编写的类通信。要点是:1.用一种语言编写的类应能继承用另一种语言编写的类。2.一个类应能包含另一个类的实例,切不管这两个类是使用的什么语言。3.一个对象应能直接调用用其他语言编写另一个对象的方法。4.对象的应用应能在方法之间传递。5.在不同的语言之间调用方法时,应能在调试器中交替调试这些方法调用,即调试不同语言编写的源代码。

2.不同的值类型和引用类型,他的特性是值类型和引用类型之间有明显的区别。储存方法:值类型,变量直接存储其数据,而对于引用类型,变量仅储存其地址,然后对应的数据可以在地址中找到。

强数据类型化
如果数据类型不做显式转换,不能随意赋值,叫做强数据类型。相对的弱数据类型,在不做显示转换的情况下,将其赋值给其他类型,可做自动转换的,叫做弱数据类型。上面的中间语言的一个重要的方面是它基于强数据类型化。强迫实现类型的安全性会降低性能。但在许多情况下,我们从.NET提供的,依赖于类型安全的服务中获得更多好处。服务包括:·语言的互操作性·垃圾收集·安全性·应用程序域。
1.语言互操作性中强数据类型化重要的原因:如果类派生自其它类,或包含其他类的实例,它就需要知道其它类使用的所有数据类型。
例如:假定将Visual Basic 2010类中的一个方法定义为返回一个Integer---Visual Basic 2010可以使用的标准数据类型之一。但C#没有该名称的数据类型,显然,只有编译器知道如何把Visual Basic 2010的Integer类型映射为c#定义的某种已知类型,才可以从该类型派生,使用这个方法,并在c#代码中使用返回的类型,这个问题在.NET中如何解决呢?
回答:此类数据类型问题在.NET中使用通过类型系统(CTS)得到了解决。Visual Basic 2010的Integer实际上一个32位有符号的整数,它实际映射为中间语言类型Int32,因此在中间语言代码中就指定这种数据类型,C#编译器可以用这种,所以问题解决了。

CTS的层次结构反应了中间语言的单一继承的面向对象方法。

 

 


垃圾回收,用来在.NET中进行内存管理,特别是它可以恢复正在恢复在运行的应用程序需要的内存。

 

windows平台已经使用了两种技术来释放进程向系统动态请求的内存:1·完全以手工方式使应用 程序代码完成这些工作。2·让对象维护引用计数。 那么.NET运行库采用的方法是垃圾回收器,这是一个程序,它的目的是清理内存。使用的方法时 所有动态请求的内存都分配到推上(所有的语言都是这样处理的,但在.NET中,CLR维护它自己的托管堆 供.NET应用程序使用)。每隔一段时间,当.NET检测到给定进程的托管堆已满,需要清理时就会调用垃圾回收器。 垃圾回收器处理目前代码中的所有变量,检测对储存在托管堆上的对象的引用,确定哪些对象可以从代码中访问 就是哪些对象有引用,没有引用的对象就不在认为可以从代码中访问,因而被删除。

应用程序域它用于减少运行应用程序的系统开销,这些应用程序需要与其他程序分离开来,但仍需要彼此通信。

孤立代码的唯一方式是通过进程来实现的,启动一个新的应用程序时,它会在一个进程环境内运行,Windows通过地址空间把进程分割开来,每个进程有4GB的虚拟内存来储存其数据和可执行代码,(4GB对应的是32位系统)它利用额外的间接方式把这些虚拟内存挂载到物理内存或磁盘空间的一个特殊区域中,每个进程都会有不同的挂载,虚拟地址空间块挂载的物理内存之间不重叠。

任何进程都只能通过指定虚拟内存中的一个地址来访问内存,也就是进程不能直接访问物理内存,因此一个进程不可能访问分配给另一个进程的内存。

进程对确保安全有很大的帮助,但它们有个大缺点就是性能。解决这一问题的方法时使用基于DLL的组件,让所有的组件在同一个地址空间中运行————其风险是执行出错的组件会影响其他组件。

应用程序域是分离组件的一种方式,它不会导致因在进程之间传递数据而产生性能问题,其方法是把任何一个进程分解到多个应用程序域中,每个应用程序域对应一个应用程序,执行的每个线程都运行在一个具体的应用程序域中。

 

 程序集

程序集是包含编译好的,面向.NET Framwork的代码的逻辑单元。

要点:它是一个逻辑单元。程序集的一个重要的特性是他们包含的元数据描述了对应代码中定义的类型和方法,程序集包含程序的元数据。

程序集的两种类型:私有程序集和共享程序集。1.私有程序集一般是附带在某个软件上的,常见的情况是,以可执行文件或许多库的方式提供应用程序这些库包含的代码只能用于该应用程序,。0影响(xcopy)安装是:把相应的文件放在文件系统的对应文件夹中。共享程序集是其他应用程序可以使用的公共库。全局程序集缓存是把共享程序集放在文件系统的一个特定的子目录树中。根据私钥加密法为共享程序集指定一个名称称为强名。(必须由要引用共享程序集的应用程序来引用)。

反射 因为程序集储存了元数据,包括在程序中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。

.NET基类的一个主要优点是非常的直观和易用。例如,要启动一个线程,可以调用Thread类的Start()方法。要禁用TextBox,应把TextBox对象的Enabled的属性设置为false.

名称空间可以互相嵌套,大多数用于一般目的的.NET基类位于名称空间System中,基类Arry在这个名称空间中,全名就是System.Arry。.NET需要在名称空间中定义所有的类型如:把Customer类放在名称空间中YourCompanyName中,则这个类的全名就是YourCompanyName.Customer.

用c#创建.NET应用程序

创建asp.net应用程序1.ASP.NET的功能

主要;ASP.NET页面是结构化的,ASP.NET页面的另一个优点是可以在Visual Studio 2010中建立他们,在该环境下,可以创建ASP.NET页面使用的业务逻辑和数据访问组件。Wed服务器控件用于添加到Wed窗体上的控件与ActiveX控件并不是一种控件,他们是ASP.NET名称空间中的xml标记。

XAML是用于创建窗体的XML声明,它代表WPF应用程序的所有可视化部分和操作。

.NET的下述特性在编译和执行过程的作用:程序集和.NET基类,COM组件,JIT编译,应用程序域,垃圾回收。