01 2014 档案
摘要:7.1常量 常量(constant)是一个特殊的值,它是一个从不变化的值。 在定义常量时,它的值必须在编译时确定。确定之后,编译器将常量的值保存到程序集的元数据中。这就意味着只能为编译器认定的基元类型定义常量。 C#是允许定义一个非基元类型的常量变量(constant variable),但这个值应设为null。public sealed class SomeType { //SomeType不是基元类型,但C#允许定义 //值为null的这种类型的一个常量变量 public const SomeType Empty = null; } 由于常量的值从不变化,所...
阅读全文
摘要:6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量 常量就是指出数据值恒定不变的符号。这些符号通常用于使代码更容易阅读和维护。常量通常与类型关联,而不与类型的实例关联。从逻辑上讲,常量始终是静态成员。 2)字段字段表示一个只读或可读/写的数据值。字段可以是静态的,这时是类型状态的一部分;字段也可以是实例(非静态)的,这时字段是对象状态的一部分。强烈建议将字段声明成为私有字段,防止类型或对象状态被外部代码破坏。 3)实例构造器 实例构造器是将新对象的实例字段初始化为良好初始化状态(即完成预期初始化)的一种特殊方法。 4)类型构造器 类型构造器是将类型的静...
阅读全文
摘要:FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处。为此,System.Object提供了虚方法GetHashCode,它能获取任意对象的Int32哈希值。 如果你重写了Equals方法,那么还应重写GetHashCode方法。因为在System.Collection.Hashtable类型、System.Collections.Generic.Dictionary类型以及其他一些集合实现中,要求两个对象为了相等,必须具有相同的哈希码,所以重写了Equals,那么还应该重写GetHashCode,确保相等性算法和对象哈希码算法是一致的。 System.V...
阅读全文
摘要:在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制。 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管堆中分配好内存。分配的内存量是值类型的各个字段需要的内存量加上托管堆上的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量。 2)值类型的字段复制到新的分配的堆内存。 3)返回对象的地址。现在,这个地址是对一个对象的引用,值类型现在是一个引用类型。 拆箱不是直接将装箱过程倒过来。拆箱的代价比装箱低得多。拆箱其实就是一个获取一个指针的过程,该指针指向包含在一个对象中的原始值类型(数据字段)。事实上,指针指向的是已装箱实例中的未...
阅读全文
摘要:CLR支持两种类型:引用类型和值类型。 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型。引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址。 使用引用类型必须注意到一些性能问题,首先考虑一下事实: 1)内存必须从托管堆上分配。 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化。 3)对象中的其他字节(为字段而设)总是设为零。 4)从托管堆上分配一个对象时,可能强制执行一次垃圾回收操作。 如果所有类型都是引用类型,应用程序的性能
阅读全文
摘要:某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们。例如可以使用以下语法来分配一个整数: System.Int32 a = new System.Int32(); 当然,你肯定不愿意使用这种语法,C#允许使用如下所示的语法: int a = 0; 这种语法不仅增强代码的可读性,而且生成的IL代码和是有System.Int32时生成的IL代码是完全一致的。 编译器直接支持的数据类型称为基元类型(primitive type)。基元类型直接映射到Framework类库(FCL)中存在的类型。比如以下4行代码都是正确的,生成的IL代码也是相同的。int a = ...
阅读全文
摘要:CLR要求所有类型最终都要从System.Object派生。也就是所,下面的两个定义是完全相同的,//隐式派生自System.Objectclass Employee { .....}//显示派生子 System.Objectclass Employee : System.Object { ..... } 由于所有类型最终都是从System.Object派生的,所以可以保证每个类型的每个对象都有一组最基本的方法。 System.Object提供了如下所示的公共实例方法。 Equals(Object)确定指定的对象是否等于当前对象。如果两个对象具有相同值就返回ture.Get...
阅读全文
摘要:1.6 Framework类库1. .NET Framework中包含了Framework类库(Framework Class Library,FCL)。2. FCL是一组DLL程序集的统称,其中含有数千个类型定义,每个类型公开一些功能。1.7 通用类型系统1. CLR是完全围绕类型展开的。2. 类型为应用程序和其他类型公开了功能。通过类型,用一种编程语言写的代码能与另一种语言写的代码沟通。3. 由于类型是CLR的根本,所有MicroSoft指制定了一个正式的规范,即"通用类型系统"(Common Type System,CTS),它描述了类型的定义和行为。4. CTS规定
阅读全文
摘要:1. NGen.exe工具,可以在一个程序安装到用户计算机时,将IL代码编译成为本地代码。由于代码在安装时已经编译好,所以CLR的JIT编译器不需要再运行时编译IL代码了,这有助于提升程序的性能。2. NGen.exe可以加快程序的启动速度,减少程序的工作集。3. NGen.exe生成的文件存在以下问题: 1)没有知识产权保护。在运行时,CLR要求访问程序集的元数据,这就要求同时发布包含IL代码和元数据的程序集。 2)NGen生成的文件可能失去同步。NGen生成的文件时,会与当前执行环境相适应的,当你改变了先前的执行环境时,NGen生成的文件就不能使用了。 3)较差的执行时性能。NGen...
阅读全文
摘要:1. 托管程序集同时包含元数据和IL。IL是与CPU无关的机器语言。可将IL是为一种面向对象的机器语言。2. IL也是能使用汇编语言来写的,MicroSoft专门提供了一个名为ILAsm.exe的IL汇编器和一个名为ILDasm.exe的IL反汇编。3. 高级语言只公开了CLR的所有功能的一个子集,IL汇编语言允许开发人员访问CLR的所有功能。如果你需要当前使用的语言不支持的CLR功能,可以使用IL语言或者其他CLR语言。4. 为了执行一个方法,首先必须将它的IL转换成为本地CPU指令,这是CLR的JIT(just-in-time或"即时")编译器的职责。5. 展示一个方法
阅读全文
摘要:1. 你生成的每个程序集可以是EXE,也可以是DLL。最终都是有CLR管理这些程序集中代码的执行。2. VS2010中,创建新的EXE项目时,默认平台是x86,而不是anycpu。3. Windows的64位版本提供了一个名为WoW64(Windows on Windows64)的技术,允许允许32位的Windows程序。这是因为这个技术能模拟x86的指令集,但这样会显著影响性能。4. 编译目标平台对生成的模型的影响以及运行时的影响。5. Windows检查好EXE文件头,决定创建32位、64位还是WoW64进程之后,会在进程的地址空间中加载MSCorEE.dll的x86,x64或IA64版本
阅读全文
摘要:1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的。2. 程序集是一个或多个托管模块/资源文件的逻辑性分组。3. 程序集是重用、安全性以及版本控制的最小单位。4. 程序集取决于你对编译器的选择,可以生产单文件程序集,也可以生产多文件程序集。在CLR中,程序集相当于一个"组件"。5.将托管模块合并成程序集图示:生成的 程序集会包含一个名为"清单"(maniest)的数据块。清单是有元数据构成的另一种集合。这些表描述了构成程序集的文件。6. 默认情况下,编译器实际会把生成的托管模型转化成程序集。C#编译器会生成含有清单的一个托管模块。清单指出程序
阅读全文
摘要:1.公共语言运行时(Common Language Runtime,CLR)是一种可由多种编程语言使用的"运行时"。2. CLR的核心功能(比如内存管理,程序集加载、安全性、异常处理和线程同步等)可由面向CLR的所有语言使用。3. 用一个对应的编译器编译源代码之后,结果都是一个托管模块。4.托管模块是一个标准的32/64位Microsoft Windows 可移植执行体(PE32/PE32+)文件,它们都需要CLR才能执行。5. 托管的程序集利用Windows的数据执行保护和地址空间布局随机化增强整个系统的安全性。6. 托管模块的各个组成部分7. 本地代码编译器生成的是面向
阅读全文
摘要:今天搞到NHibernate时,突然报了一个“NHibernate.Cfg.Configuration 的类型初始值设定项引发异常。”的异常。详细异常信息“System.IO.FileLoadException”类型的异常在 WebApplication1.dll 中发生,但未在用户代码中进行处理其他信息: 未能加载文件或程序集“log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)”注
阅读全文
摘要:在开始UnitOfWork模式之前有必要回顾下我们耳熟能详的Data Access Object(DAO)模式,即数据访问对象。DAO是一种简单的模式,我们构建应用的时候经常会使用到它,它的功能就是将DAL元素从应用程序中分离出来,在经典的三层架构中,我们会将数据持久化工作单独分离出来,封装成DAL层。但是,DAO并没有隐藏它面对是一张张数据表,而且通常情况我们会为数据库中的每一张表创建一个DAO类,想必大家对这种方式的极度的不爽了,。 由于DAO模式与数据表是一对一匹配的关系,因此DAO模式很好的配合了Active Record和Transaction Script业务模式,尤其是Ta...
阅读全文