随笔分类 - Aoubt .Net
摘要:元数据表程序集的元数据是用一系列表来存储的。生成一个程序集或者模块时,编译器会创建一个类型定义表、一个字段定义表、一个方法定义表以及其他表反射的性能反射会造成编译时无法保证类型安全性。由于反射要严重依赖字符串,所以会丧失编译时的类型安全性。反射速度慢。使用反射时,类型及其成员的名称在编译时未知。要使用字符串名称表示每个类型及其成员,以便在运行时发现他们。也就是说,使用System.Reflection命名空间的类型扫描程序集的元数据时,反射要不断的执行字符串搜索和比较。发现类型的成员字段、构造器、方法、属性、事件和嵌套类型都可以被定义为一个类型的成员。下图显示了这些类型的层次结构:Declar
阅读全文
摘要:AppDomain的功能: 一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。只能使用“按引用封送”(marshal-by-reference)或者“按值封送”(marshal-by-value)的语意 AppDomain可以卸载。CLR不支持从AppDomain中卸载一个程序集,但可以卸载一个AppDomain,从而卸载当前包含在该AppDo...
阅读全文
摘要:垃圾回收算法: 第一阶段:垃圾回收的第一阶段是标记(marking)。在这个阶段中,垃圾回收器杨喆线程栈上行以检查所有的根。如果发现了一个根引用了一个对象,就在对象的“同步块索引字段”上开启标记。检查好所有的根之后,堆中将包含一组已标记和未标记的对象。已标记的对象是通过应用程序的代码可达的对象,而未标记的对象是不可达的。不可达的被认为是垃圾。 第二阶段:垃圾回收的第二阶段是压缩(compact...
阅读全文
摘要:[ComVisible(true)] [Serializable] public enum StringComparison { CurrentCulture, CurrentCultureIgnoreCase, InvariantCulture, InvariantCultureIgnoreCase, ...
阅读全文
摘要:主要约束:主要约束可以是一个引用类型,标识了一个没有密封的类。指定一个引用类型约束时,相当于向编译器承诺:一个指定类型的实参要么是与约束类型相同的类型,要么是从约束类型派生的一个类型。如果一个类型参数没有指定主要约束,就默认认为System.Object。有两个特殊的主要约束:class和struct。其中class想编译器承诺一个指定的类型实参是引用类型 internal sealed ...
阅读全文
摘要:泛型委托:委托实际只是提供了4个方法的一个类定义。这4个方法包括:一个构造器、一个Invoke方法、一个BeginInvoke方法和一个EndInvoke方法。如果定义的一个委托类型指定了类型参数,编译器会定义委托类的方法,用指定的类型参数替换方法的参数类型和返回值类型 利用逆变或者协变,可以将泛型委托类的一个变量转型为同一个委托类型的另一个变量,后者的泛型参数类型不同 不变量(invaria...
阅读全文
摘要:实例构造器:作用是设置类型的实例的初始状态 类型构造器:即static构造器,作用是设置类型的初始状态(通常是初始化静态字段)。类型默认没有定义类型构造器,如果定义也只能定义一个。此外,类型构造器永远没有参数 实例构造器的调用:JIT编译器在编译一个方法时,会查看代码中都引用了哪些类型。任何一个类型定义了类型构造器,JIT编译器都会检查对当前AppDomain,是否已经执行了这个类型构造器。如...
阅读全文
摘要:静态类必须直接从System.Object派生,从其他任何基类派生没有任何意义。无法创建静态类的实例 静态类不能实现任何接口,这是因为只有使用类的一个实例时,才可以调用类的接口方法 静态类只能定义静态成员(字段、方法、属性和事件),任何实例成员都将导致编译器报错 静态类不能作为字段、方法参数或者局部变量使用,因为它们都代表引用了一个实例的变量 C#编译器将静态类标记为...
阅读全文
摘要:基元(Primitive):在代码中可以使用的最简单构造 用户模式基元:使用特殊的CPU指令来协调线程,即协调是在硬件中发生的,速度很快。但是Windows永远检测不到一个线程在一个基元用户模式中够钟上阻塞了。所以,想要取得一个资源但又暂时娶不到一个线程会一直在用户模式中运行,这可能浪费大量的CPU时间 内核模式基元:要求应用程序的线程中调用在操作系统内核中实现的函数。一个线程使用一个内核模式...
阅读全文
摘要:线程池中的线程由两类组成:工作者线程和I/O线程。 ThreadPool.QueueUserWorkItem和Timer类总是将工作项(即线程要回调的委托)放到全局队列中。工作者线程采用一个FIFO算法将工作项从这个队列中取出,并处理它们。由于多个工作者线程可能同时从全局队列中拿走工作项,所以所有的工作者线程都竞争一个线程同步锁,以保证两个或者多个线程不会获取同一个工作项。 对于默认的Task...
阅读全文
摘要:为了取消一个操作,首先必须创建一个System.Threading.CancellationTokenSource对象。这个对象包含了和管理取消有关的所有状态。构造好一个CancellationTokenSource之后,可同从它的Token属性获得一个或者多个CancellationToken实例,并传给相应的操作,使得那些操作可以取消。在一个计算限制操作的循环中,可以定时调用Cancellat...
阅读全文
摘要:CLR为每个线程分配了从0(最低)~31(最高)的一个优先级。CLR线程的优先级取决于两个标准: 进程的优先级类 – Idle, Below Normal, Normal, Above Normal, High, Realtime 在其进程的优先级类中,线程的优先级 – Idle, Lowest, Below Normal, Normal, Above Normal, Highest...
阅读全文
摘要:线程开销包括以下几方面: 线程内核对象(Thread kernel object):包含一组对线程进行描述的属性。该数据结构中还包括线程上下文(Thread context)。上下文是一个内存块,其中包含了CPU的寄存器集合。 线程环境块(Thread environment block):用户模式中分配和初始化的一个内存块,应用程序代码能够快速访问的地址空间。 用户模式栈:用...
阅读全文
摘要:using System;using System.Threading;namespace APMResearch{ public delegate T Func<T>(); public class SimpleAsyncResult<T> :IAsyncResult { private volatile int _mIsCompleted; pri...
阅读全文
摘要:在Entity Framework中,可以通过属性的方式来访问有外键关系的表。当通过这种方式来访问的时候,存在一个何时加载关系表的问题。一共有lazy, delayed, eager 这三种方式。默认的方式是lazy。 public EFDemoEntities() : base("name=EFDemoEntities", "EFDemoEntities") { this.ContextOptions.LazyLoadingEnabled = true; OnContextCreated(); }Lazy方式载入数据:当要访问外键表的数据的时候才会载入
阅读全文
摘要:To retrieve data from the database, the ObjectContext class is needed. This class defi nes the mapping fromthe entity objects to the database.The ObjectContext class provides several services to the caller:1.It keeps track of entity objects that are already retrieved. If the object is queried again,
阅读全文
摘要:关于调试windowsservice, 其实这是一个老生常谈的问题了.通常的处理办法是,在service运行后, 在调试器中选择attachto process.然而这种做法也有一定的局限性, 例如在service启动时的OnStart事件中的代码, 基本上很难调试.往往当attach到我们的service的时候, 这部分代码已经执行过了.于是,有人提出,可以另写一个project来调用这个OnStart方法, 或将OnStart方法中的代码搬到另一个project中测试. 不过, 这些方法终究不是以windows服务的方式调试的,不能够最真实的反应service运行时的执行状况(如权限问题等
阅读全文

浙公网安备 33010602011771号