⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 123456.txt

📁 c#编程入门,我在其它网站收集的."功能描述要求的字数太多能不能少一点"
💻 TXT
📖 第 1 页 / 共 5 页
字号:
        图2.1 JIT编译管理器允许你设置各种相关性能的选项  

    尽管它是一个小小的对话框,可是你所选择的选项功能是相当强大的。每一个选项将在以下描述。  
    Use EconoJIT only 选项——当该复选框没有选上时,NGWS runtime使用默认的正常的JIT编译器。前面就曾经解释过  
两种JITter的区别。  
    Max Code Pitch Overhead(%)选项——该设置仅保留给EconoJIT。它控制了JIT编译时间和执行代码时间的百分比。如  
果超过了设定的域值,代码缓冲区得到扩充,以缩短JIT编译所消耗的时间。  
    Limit Size of Code Cache选项——该项默认为非选。没有选择该项意味着缓冲区将使用它所能得到的内存。如果你  
想限制缓冲区大小,复选该选项,这将允许你使用Max Size of Cache(bytes)选项。  
    Max  Size  of  Cache(bytes)选项—控制容纳JIT代码的缓冲区的最大值。虽然你可以非常严格地限制这个值,但你  
还是应该小心,不能超过这个缓冲区所适合的最大值。否则该方法的JIT编译将会失败。  
    Optimize For Size选项——告诉JIT 编译器,优化的目的是为了使代码更小而不是能执行得更快。这个设置默认是关  
掉的。  
    Enable Concurrent GC[garbage collection]选 项——垃圾收集(GC)默认地运行在用户代码的线程中。意味GC发生  
时,可能会注意到回应有轻微的延迟。为防止出现该现象,打开当前GC。注意,当前GC比标准GC更慢,它仅在windows   
2000上写时(the time of writing)有效。  
    当用C#创建项目时,你可能使用不同的设置试验过。当创建 UI-intensive应用程序时,你将会看到允许当前GC的最大  
差别。  

2.2 虚拟对象系统(VOS)  
    到目前为止,你仅看到了NGWS runtime如何工作,但是并不了解它工作的技术背景以及为什么它要这样工作。这节都  
是关于 NGWS 虚拟对象系统的(VOS)。  
    以下为在VOS中形成声明、使用和管理类型模型时,NGWS runtime的规则。在VOS背后的思想是建立一个框架,在执行  
代码时不能牺牲性能,允许交叉语言集成和类型安全。  
    我提到的框架是运行时架构的基础。为了帮助你更好地了解它,我将它勾出四个区域。当开发C#应用程序和组件时,  
理解它们很重要。  
    VOS类型系统——提供丰富的类型系统,它打算支持全面编程语言的完全实施。  
    元数据——描述和引用VOS类型系统所定义的类型。元数据的永久格式与编程语言无关,但是,元数据拿自己当作一种  
互换机制(nterchange mechanism)来使用,这种互换是在在工具和NGWS的虚拟执行系统之间。  
    通用语言规范(CLS)——CLS定义了VOS中类型的子集,也定义了常规的用法。如果一个类库遵守CLS的规则,它确保类  
库可以在其它所有能实现CLS的编程语言上使用。  
    虚拟执行系统(VES)——这是VOS实时的实现。VES负责装入和执行为NGWS运得时编写的程序。  
    这四个部分一起组成了NGWS runtime架构。每一部分在下面小节中描述。  

2.2.1 VOS类型系统  
    VOS类型系统提供丰富的类型系统,它打算支持多种编程语言的完全实施。所以,VOS必须都支持面向对象的语言和过  
程编程语言。  
    现在,存在着很多种近似但有点不兼容的类型。就拿整型当例子,在VB中,它是16位长,而在C++中,它是32位。还有  
更多的例子,特别是用在日期和时间以及数据库方面的数据类型。这种不兼容使应用程序的创建和维护不必要地复杂化,  
尤其当程序使用了多种编程语言时。  
    另一个问题是,因为编程语言之间存在着一些差别,你不能在一种语言中重用另一种语言创建的类型。(COM用二进制  
标准接口部分地解决了这个问题)。 当今代码重用肯定是有限的。  
    发布应用程序的最大障碍是各种编程语言的对象模型不统一。几乎每一方面都存在着差异:事件、属性、永久保存  
(persistence)等等。  
    VOS这里将改变 这种现象  。VOS定义了描述值的类型,并规定了类型的所有值所必须支持的一条合约。由于前面提到  
的支持面向对象和过程编程语言,就存在着两种值和对象。  

    对于值,类型存储于表述(representation)中,同样操作也在其中实行。对象更强大因为它显式地存于表述中。每一  
个对象都有一个区别于其它对象的识别号。支持不同的VOS类型在第四章 "C#类型"中提出。  


2.2.2元数据  
    尽管元数据用于描述和引用由VOS类型系统定义的类型,但它还不能锁定到这个单个目标。当你写一个程序时,通过利  
用类型声明,你所声明的类型(假定它们是数值类型或引用类型)被介绍给NGWS runtime类型系统。类型声明在存于PE可执  
行文件内部的元数据中得到描述。  
    基本上,元数据用于各项任务:用于表示NGWS runtime用途的信息,如定位和装载类、  内存中这些类的事例、解决  
调用 、翻译IL为原始码、加强安全并设置运行时上下文边界。  
    你不必关心元数据的生成。元数据是由C#的"代码转IL编译器"(code-to-IL compiler,不是JIT编译器)生成的。代码转  
IL编译器发送二进制元数据信息给PE文件,是以标准的方式发送的,不象C++编译器那样,为出口函数创建它们自己的修饰  
名字。  
    你从元数据和可执行代码并存所获得的主要优势为,有关类型的信息同类型自身固定在一起,不会遍布很多地方。同  
样有助于解决存在于COM中的版本问题。进一步地,你可以在相同的上下文中使用不同的版本库,因为库不仅被注册表引  
用,也被包含在可执行代码中的元数据引用。  


2.2.3通用语言规范  
    通用语言规范(CLS)并不是虚拟对象系统(VOS)真正的一部分,它是特殊的。CLS定义了VOS中的一个类型子集,也定义  
了必须符合CLS的常规用法。  
    那么,对此有什么迷惑呢?如果一个类库遵守CLS规则,其它编程语言同样也遵守CLS规则,那么其它编程语言的客户也  
可以使用类库。CLS是关于语言的交互可操作性(interoperability)。因此,常规用法必须仅遵循外部可访问项目   
(externally visible  items)如方法、属性和事件等等。  
    我所描述的优点是你可以做以下工作。用C#写一个组件,在VB中派生它,因加在VB中的功能是如此之强大,在C#中再  
次从VB类派生它。只要所有的外部可访问项遵守CLS规则,这样是可行的。  
    我在这本书中出示的代码不关心CLS协定。但在构建你的类库时要注意到CLS协定。我提供了表2.1,用以给类型和外部  
可访问项定义协定规则。  
    这个清单不完整。它仅包含一些很重要的项目。我不指出出现在本书中每一种类型的CLS协定,所以有个好主意:当你  
寻找CLS协定时,至少应该用浏览该表,以了解哪种功能有效。不要担心你不熟悉这章表中的每一个含义,在这本书中你会  
学到它们。  

                        表2.1   通能语言规范中的类型和功能  

     bool  
     char  
     byte  
     short  
     int  
     long  
     float  
     double  
     string  
     object(所有对象之母)  
      
     Arrays(数组)  
     数组的维数必须是已知的(>=1),而且最小下标数必须为0。  
     要素类型必须是一个CLS类型。  

     类型(Types)  
     可以被抽象或隐藏。  
     零或更多的接口可以被实现。不同的接口允许拥有具有相同名字和签名的方法。  
     一个类型可以准确地从一个类型派生。允许成员被覆盖和被隐藏。  
     可以有零或更多的成员,它们是字段(fields)、方法、事件或者类型。  
     类型可以拥有零或更多个构造函数。  
     一种类型的可访问性可以是公共的或者对NGWS组件来说是局部的;但是,仅公共成员可以认为是类型接口的一部分。  
     所有的值型必须从系统值型继承。异常是一个枚举——它必须从系统枚举(System Enum)继承。  
                         
     类型成员  
     类型成员允许隐藏或者覆盖另一种类型中的其它成员。  
     参数和返回值的类型都必须是 CLS 协定 类型。  
     构造函数、方法和属性可以被重载。  
     一个类型可以有抽象成员,但仅当类型不被封装时。  

     方法  
     一种方法可以是静态、虚拟或者实例。  
     虚拟和实例方法可以是抽象的,或者是一个实现。静态方法必须总拥有一个实现。  
     虚拟方法可能是最后的(或者不是)。  

     字段(Fields)  
     可以是静态或者是非静态。  
     静态字段可以被描述或只初始化。  

     属性  
     当获取和设置方法而不是使用属性语法时,属性可以公开。  
     获取的返回类型和设置方法的第一个参数必须是相同的CLS类型——属性的类型。  
     属性名字必须不同,不同的属性类型用于区分是不充分的。  
     由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为   
get_PropertyName 和 set_PropertyName 的方法。  
     属性可以被索引。  
     属性访问必须遵循这种命名格式:get_ProName,set_PropName。  

     枚举(Enumerations)  
     强调类型必须是byte、short、int 或long。  
     每一个成员是一个枚举类型的静态描述字段。  
     一个枚举不能实现任何接口。  
     你允许给多字段设定相同的值。  
     一个枚举必须继承系统枚举(隐含在C#中)         

     异常  
     可以被引发和被捕获。  
     自定义异常必须继承系统异常。  

     接口  
     可需要实现其它接口。  
     一个接口可以定义属性、事件和虚拟方法。实现取决于派生类。  
       
     事件  
     增加和取消方法必须是都提供或者都没有 ,每一种方法采用一个参数,它是一个从系统代表元(System Delegate)派  
生下来的类。  

     自定义属性  
     可以仅使用下更类型:Type(类型),char, char, bool, byte, short, int, long, float, double, enum (一种CLS   
类型), and object.  

     代表元(Delegates)  
     可以被创建和被激活  

     标识符(Identifiers)  
     一个标识符的第一个字母必须来自一限制集。  
     通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符(大小写不敏感)。  

2.2.4虚拟执行系统(VES)  
     虚拟执行系统实现了虚拟对象系统。通过实现一个负责NGWS runtime的执行引擎(execution engine,缩写EE)创建  
VES。这个执行引擎执行你用C#编写和编译的应用程序。  
     下列组件为VES的一部分。  
     1、中间语言(IL)——被设计为很容易受各种各样的编译器所兼容 。在该框架之外,C++、VB和C#编译器都能够生成  
IL。  
     2、装入受管代码——这包括解决内存中的名字、 表层类(laying out classes ),并且创建JIT编译所必需的存根。  
通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性。  
     3、用JIT转换IL成原始代码——IL代码并不是设计成为一种传统的解释字节代码或树型代码,IL转换是真正的编译。  
     4、装入元数据、校验类型安全和方法的完整性  
     5、垃圾收集(GC)和异常处理——两者都是基于堆栈格式的服务。受管代码允许你动态地跟踪堆栈。要动态地识别各  
个堆栈框架,JITter或其它编译器必须提供一个代码管理器。  
     6、描绘和查错服务——两者都取决于由源语言编译器所生成的信息。必须发出两个映射:一个映射从源语言结构发  
到指令流中的地址,一个映射从地址发到堆栈框架中的位置。当执行从IL到原始代码的转换时,这些映射被重新计算。  
     7、管理线程和上下文,还有远程管理——VES为受管代码提供这些服务。  
     虽然这个清单并不完整,但它足以让你理解运行时基于的由VES提供的低层架构。肯定将会有专门讨论运行时的书,  
而这本书将稍为深入地挖掘各种话题。  

2.3 小结  
     这一章,我带你逛了一回运行时的世界。我描述了当创建、编译和配置C#程序时它是如何工作的。你学会了中间语言  
(IL),还有元数据是如何用于描述被编译为IL的类型。元数据和IL都用于JITter检测和执行你的代码。你甚至可以选择用  
哪一种JITter来执行应用程序。  
     在这一章的第二部分,涉及到了运行时为何按这种方式工作的理论。你学了虚拟对象系统(VOS)和组成它的那部分。  
对于类库设计者最为感兴趣的就是通用语言规范(CLS),它为基于VOS的语言交互操作设定规则。最后,你看到了虚拟执行  
系统(VES)如何通过NGWS runtime实现VOS。  



3.0   选择一个编辑器  
         尽管我是一个顽固的Notepad狂,但这次我不建议用它编辑源码。原因是你正在与真正的编程语言打交道,使用  
Notepad编辑源码编译时可能产生大量的错误信息行(C++程序员知道我在说什么。)  
         你有几种选择。可以重新配置你信任的老式Visual C++ 6.0,使它能够和C#源文件一起工作。第二种选择是使用  
新的Visual Studio 7。第三,你可以用任何第三方程序编辑器,最好要支持行数、色彩编码、工具集成和良好的搜索功  
能。CodeWright就是其中一个例子,如图3.1所示。  

         图3.1 CodeWright 是你可以用于创建C#代码文件众多可能编辑器中的一个。  

        当然,在所提到的编辑器中,没有一个对创建C#程序来说是必要的。用Notepad肯定可以编辑。但是,如果你考虑  
到要编写更大的项目,最好还是忍痛割爱吧。  

3.1  "Hello World" 代码  
        讨论编辑器有点离题 ,让我们把话题转回到一个非常出名的小应用程序。这个最短的C#版本应用程序见清单  
3.1。把它存起来,文件名为 helloworld.cs,以便使你能按照说明,完成诸如编译应用程序等其它余下来的步骤。  

        清单 3.1   最简单的 "Hello World "程序  

         1: class HelloWorld  
         2: {  
         3:  public static void Main()  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -