摘要:
本篇目录1,垃圾回收的基本概念 1.1 小对象堆和大对象堆 1.2 垃圾回收中的“代” 1.3 堆和“代”的关系2,啥时执行垃圾回收?3,垃圾回收器是如何工作的? 3.1标记无效对象。 3.2 压缩阶段。 3.3 终结揭秘4 ,Dispose模式:强制对象清理资源1,垃圾回收的基本概念1.1 小对象堆和大对象堆 我们都知道,CLR将我们的引用类型分配到托管堆上。这里指的托管堆实际是一个笼统的称呼。它实际是由一个小对象堆(small object heap,SOH)和一个大对象堆(large object heap,LOH)组成的。为对象分配空间时,将对象分为小对象(small object). 阅读全文
随笔档案-2012年07月
《CLR via C#》笔记——异常和状态管理
2012-07-30 12:48 by xiashengwang, 2824 阅读, 收藏, 编辑
摘要:
目录一,定义异常二,异常处理机制 2.1 try块 2.2 catch块 2.3 finally块 2.4 CLS和非CLR异常三,System.Exception类四,抛出异常五,自定义异常类六,用可靠性换取开发效率七,指导原则和最佳实践 7.1 善用finally块 7.2 不要什么都捕捉 7.3 得体的从异常中恢复 7.4 从不可恢复的异常中回滚——维持状态 7.5 隐藏实现细节来维持契约八,未处理异常九,约束执行区(CER)十,代码契约一,定义异常 什么时候应该抛异常?当一个类型的成员(如方法,属性)不能完成任务时,就应抛出异常。面向对象的编程大大... 阅读全文
Linq学习之旅——Linq to Objects之延期执行方法(下篇)
2012-07-29 22:18 by xiashengwang, 1156 阅读, 收藏, 编辑
摘要:
目录1,Intersect 方法2,Except方法3,Range方法4,Repeat方法5,Empty方法6,DefaultIfEmpty方法7,Cast方法8,OfType方法9,AsEnumerable方法 本篇继续学习剩余的延期执行方法。1,Intersect 方法 Intersect 方法用于生成两个序列的交集。 string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" }; string[] names2 = { "郭靖&quo 阅读全文
Linq学习之旅——Linq to Objects之延期执行方法(上篇)
2012-07-29 17:54 by xiashengwang, 2938 阅读, 收藏, 编辑
摘要:
目录1,Take 方法2,TakeWhile 方法3,Skip 方法4,SkipWhile 方法5,Reverse 方法6,Distinct 方法7,Union 方法8,Concat 方法 LINQ to Objects是LINQ的基础,而LINQ to SQL、LINQ to XML是中间LINQ提供程序,他们主要是把数据源转换成LINQ to Objects兼容的类型,以便LINQ to Objects进行操作。LINQ to Objects就是直接对IEnumerable或泛型IEnumerable<T>集合进行查询。LINQ表达式是LINQ标准查询运算符的一部分,而LINQ 阅读全文
Linq学习之旅——LINQ查询表达式
2012-07-28 22:01 by xiashengwang, 45818 阅读, 收藏, 编辑
摘要:
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”。 阅读全文
C# 3.0 新特性概览
2012-07-23 22:33 by xiashengwang, 606 阅读, 收藏, 编辑
摘要:
1. 隐式类型局部变量(Implicitly Typed Local Variables)隐式类型局部变量的具体类型取决于初始化它的表达式。在一个局部变量声明时,前面加一个var关键字,这个局部变量就被叫做隐式类型局部变量。例如: var i = 0; var s = "Hello"; var d = 1.0; var numbers = new int[] { 2, 4, 7, 8 }; var order = new Dictionary<string, string>();上... 阅读全文
《CLR via C#》笔记——可空值类型
2012-07-20 18:15 by xiashengwang, 463 阅读, 收藏, 编辑
摘要:
一,可空值类型 顾名思义,这种类型支持null值。在FCL中被定义为System.Nullable类型。这是一个结构体类型(struct),所以,不要认为System.Nullable是一个引用类型,它仍然是一个值类型。要使用可空值类型,在代码中可以这样写: Nullable x = 10; Nullable y = null; Console.WriteLine("x: HasValue={0} Value={1}", x.HasValue, x.Value); Console.WriteLine("y:... 阅读全文
《CLR via C#》笔记——线程基础
2012-07-20 14:22 by xiashengwang, 1404 阅读, 收藏, 编辑
摘要:
一,Windows为什么要支持线程 进程(process)是应用程序的一个实例要使用的资源的一个集合。每个进程都有一个虚拟化的地址空间,确保一个进程的代码不会被另外一个进程访问,这确保了应用程序的健壮性和安全性。但当应用程序执行一个无限循环,系统中又只有一个CPU时,他会执行无限循环,不能执行其他东西。为此,Mircorsoft引入了线程。线程(thread)的职责就是对CPU进行虚拟化,Windows为每个进程提供了该进程专用的线程。如果应用程序进入无限循环,与代码相关的进程会被“冻结”,但其他进程可以继续执行。二,线程开销线程会产生空间和时间上的开销。每个线程都包含以下要素:●线程内核对象 阅读全文
《CLR via C#》笔记——运行时序列化(3)
2012-07-18 20:54 by xiashengwang, 947 阅读, 收藏, 编辑
摘要:
七,流上下文 前面讲过,一组序列化好的对象可以有许多的目的地;同一进程,同一台机器的不同进程,不同机器的不同进程等。在一些比较少见的情况下,一个对象可能想知道他要在什么地方被反序列化,从而以不同的方式生成它的状态。例如:一个包装了Windows信号量(semaphore)的一个对象,如果它知道反序列化到同一个进程中,就可能决定序列化它的内核句柄(kernel handle),这是因为内核句柄在同一进程中有效。然而,如果它知道要反序列化到同一机器的不同进程中,就可能对信号量的字符串名称进行序列化。最后,如果对象知道它要反序列化到一台不同的机器上的一个进程中,就可能抛出异常,因为信号量值在同一台机 阅读全文
《CLR via C#》笔记——运行时序列化(2)
2012-07-18 20:52 by xiashengwang, 1429 阅读, 收藏, 编辑
摘要:
五,格式化器如何序列化类型实例为了简化格式化的操作,FCL在System.Runtime.Serialization命名空间提供了一个FormatterServices类型。该类型只包含静态方法,而且不能被实例化。以下的步骤描述了格式化器如何自动序列化一个应用了SerializableAttribute的对象。1,格式化器调用FormatterServices的GetSerializableMembers方法:public static MemberInfo[] GetSerializableMembers(Type type,StreamingContext context)这个方法利用反射 阅读全文
《CLR via C#》笔记——运行时序列化(1)
2012-07-18 20:43 by xiashengwang, 1075 阅读, 收藏, 编辑
摘要:
一,运行时序列化的作用序列化(Serialization)是将一个对象转换成一个字节流的过程。反序列化(Deserialization)是将一个字节流转换回一个对象的过程。在对象和字节流之间的转化是非常有用的机制。下面是一些例子。●应用程序的状态可以轻松保存到一个磁盘或数据库中,并在应用程序下次运行时恢复。Asp.net就是利用序列化和反序列化来保存和恢复会话状态的。●一组对象可轻松复制到剪贴板,在粘贴回同一个或另一个应用程序。事实上,Windows窗体和WPF就是利用了这个功能。●一组对象可以克隆放到一边作为“备份”;与此同时,用户操纵一组“主”对象。●一组对象可轻松地通过网络发给另一台机器 阅读全文
《CLR via C#》笔记——AppDomain(2)
2012-07-17 09:22 by xiashengwang, 2236 阅读, 收藏, 编辑
摘要:
四,卸载AppDomain AppDomain很出色的一个能力就是它允许卸载。卸载AppDomain会导致CLR卸载AppDomain中的所有程序集,还会释放AppDomain的Loader堆。为了卸载一个AppDomain,可以调用AppDomain的静态方法UnLoad,这将导致CLR执行一系列的操作来卸载AppDomain。1,CLR挂起进程中执行过托管代码的所有线程。2,CLR检查所有线程栈,查看哪些线程正在执行要卸载的那个AppDomain中的代码,或者哪些线程会在某个时候返回至要卸载的那个AppDomain。在任何一个栈上,如果有准备卸载的AppDomain,CLR都会强迫对应的线 阅读全文
《CLR via C#》笔记——AppDomain(1)
2012-07-17 09:13 by xiashengwang, 4303 阅读, 收藏, 编辑
摘要:
一,Appdomain概述 CLR COM服务器初始化时,会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。宿主可以通过CLR创建额外的AppDomain。AppDomain的唯一作用就是隔离。下面是它的具体功能。●一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。●AppDomain可以卸载。●AppDomain可以单独保护。AppDomain在创建后,会应用一个权限集,它决定了在这个AppDomain中运行的程序集的最大权限。●AppDomain可以单独实施配置。AppDomain在创建后,会关联一组配置设置。这些设置主要影响CL 阅读全文
《CLR via C#》笔记——程序集的加载和反射(3)
2012-07-16 17:54 by xiashengwang, 1506 阅读, 收藏, 编辑
摘要:
五,使用反射发现类型的成员1,发现类型成员 字段,构造器,方法,属性,事件和嵌套类都可以被定义为类型的成员。FCL定义了一个System.Reflection.MemberInfo的抽象基类,封装了一组所有类型成员都通用的属性。从MemberInfo派生的一组类,每个类都封装了与一个特定类型成员相关的属性。下面是这个类型的层次结构。下面的程序演示如何查询一个类型的成员并显示与它们相关的信息。以下代码中,处理AppDomain中加载的所有程序集中的公共类型,对每个类型,调用GetMembers方法,并返回由MemberInfo派生对象构成的一个数组;对每个成员都显示他们的种类(字段,构造器,方法 阅读全文
《CLR via C#》笔记——程序集的加载和反射(2)
2012-07-16 17:41 by xiashengwang, 688 阅读, 收藏, 编辑
摘要:
四,设计支持加载项的应用程序 构建可扩展应用程序时,接口是中心。可以利用基类来代替接口,但接口通常是首选,因为它允许加载项开发人员选择他们自己的基类。下面描述了如何构建这样的应用程序。1,创建一个“宿主SDK”(Host SDK)程序集。它定义一个接口,接口的方法作为宿主应用程序和加载项应用程序之间的通信机制使用。接口的参数和返回类型,尝试使用MSCorLib.dll中定义的类型或接口。如果要传递并返回自己定义的数据类型,也应该在这个“宿主SDK”程序集中定义。一旦搞定接口的定义,就可以为这个程序集赋一个强名称(版本控制),然后把它打包并部署到合作伙伴或用户那里。一旦发布就应避免对该程序集的做 阅读全文
《CLR via C#》笔记——程序集的加载和反射(1)
2012-07-16 17:25 by xiashengwang, 2570 阅读, 收藏, 编辑
摘要:
一,程序集加载 JIT编译器在将IL代码编译成本地代码时,会查看IL代码中引用了那些类型。在运行时,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表的记录项来确定哪一个程序集定义了引用的类型。在AssemblyRef元数据记录项中记录了程序集强名称的各个部分—包括名称,版本,公钥标记和语言文化。这四个部分组成了一个字符串标识。JIT编译器尝试将与这个标识匹配的程序集加载到当前的AppDomain中。如果程序集是弱命名的,标识中将只包含名称。1,Assembly的Load方法 在内部CLR使用Assembly的Load方法来加载这个程序集,这个方法与Win32的LoadLi 阅读全文
sscli2.0(Rotor) win7+vs2008编译
2012-07-01 23:19 by xiashengwang, 485 阅读, 收藏, 编辑
摘要:
一,下载sscli2.0http://www.microsoft.com/en-us/download/details.aspx?id=4917二,编译sscli2.0需要安装Perlhttp://www.activestate.com/Products/ActivePerl/一路安装即可。三,解压sscli2.0后,需要修改一些文件,具体可参考这篇blog:http://blogs.msdn.com/b/jeremykuhne/archive/2008/02/19/sscli-2-0-and-visual-studio-2008.aspx唯一还要修改一个地方的是,打开env.core.pl文 阅读全文