随笔分类 - .NET CLR
摘要:并发模式主要是为了处理以下两种类型的问题: 1) 共享资源:每次只能由一个操作访问共享资源,从而不至于产生死锁。 2) 操作顺序。在访问共享资源时,有时要保证多个访问操作按照特定的顺序进行。 以下为11种并发模式: 1. 单线程执行模式:最简单的解决方案,确保了每次最多只有一个线程访问一个资源。 2. 静态锁定顺序:死锁的解决方案。 3. 锁对象:通过锁定唯...
阅读全文
摘要:class Class2D { public Class2D(int A, int B) { this.A = A; this.B = B; } public int A; public int B; public static C...
阅读全文
摘要:这套读书笔记是我逐字逐页的阅读Jeffrey Richter的《框架设计 CLR via C#》时做的笔记,从第1章到第18章,后6章的笔记我还在整理之中,希望能对大家有所帮助。毕竟那是一本很深很深的书,读起来是比较吃力的。希望大家能坚持读下去,或者没有读过的也一定要读一读,尤其是研究.NET3.5的朋友,务必要先读完这本书,因为这是.NET Framework的的基础。.NET版本再升级,这些核心的技术是不会变的。只有立足于此,才能以不变应万变,不为微软技术的升级所困惑。而且,深入了解CLR底层,研究WPF、WCF、WF、LINQ时才会事半功倍。我也是.NET3.5所有新技术的粉丝,我是深深领会到了苦练CLR内功的好处了。
阅读全文
摘要:问题汇总: 1.Interrupt这个方法会抛出异常,所以要捕获,原书中没有. 2.Thread的Sleep方法已经是static的,直接使用Thread.Sleep()代替实例方法 3.TryEnter方法的使用,是否需要Monitor.Exit()搭配使用 P89 书中Sample报错 4.AutoResetEvent类 信号概念 5.Mutex P101, 书中Sample出错:少两行输出,...
阅读全文
摘要:3.1 从可串行化的类中定制XML串行化 1.格式化XML文档元素 [XmlRoot(ElementName = "Pupil", Namespace = "urn:MyNamespace")] public class Student { //则生成XML文档中,根元素 } 2.格式化XML元素 [XmlE...
阅读全文
摘要:深串行化:串行化对象的整个状态 使用命名空间: using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; 串行化类的标志:在...
阅读全文
摘要:浅串行化:只串行化类的公共字段和属性 公共属性必须是可读且可写的 使用命名空间:using System.Xml.Serialization; 以Book类为例: 串行化模板: public void SerializeIt(string filename) { XmlSerializer serialize...
阅读全文
摘要:事实上,JIT编译器分成两种(经济编译器和普通编译器),而且它们生来也不是平等的。经济JIT编译器代表了运行一个.NET应用程序所需要的最少功能,它直接用对等的本机代码取代每一条MSIL指令,不进行任何优化从而也带来更少的系统负载。这也意味着它主要应用在内存等资源比较紧张的平台上。 另一方面,普通JIT编译器则是缺省的运行时配置,它会对其产生的代码进行即时优化。这样做无形中给予了...
阅读全文
摘要:11.1 字符 Char,16位Unicode代码值 两个常量字段,Char.MinValue:定义为'\0';Char.MaxValue:定义为'\uffff'; Char.GetUnicodeCategory()方法,返回字符类型(货币/标点/数学符号等等) Char与Int32的相互转型: 11.2 字符串...
阅读全文
摘要:1.Protected internal(意思是protected或者internal),在成员声明是同时选择protected和internal两个修饰符.protected internal的意思是"只有本程序内或者继承于该类的类型可以访问" 2.Namespaces隐式地具有共有访问级别.在声明Namespaces的时候不允许用访问级别修饰符. 3.在编译单元或者Namespaces声明...
阅读全文
摘要:CLR以及所有托管语言都不支持多继承,通过接口模拟实现 14.1 类和接口的实现 接口定义:为一组方法签名指定一个名称的方式。 类实现接口,就一定要提供接口所有方法的实现。 即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法留给派生类去实现,如下: public interface ITest { ...
阅读全文
摘要:CLR支持一维/多维/交错数组。 两种声明方式: Array a; a = new String[0, 1]; String[] s = new String[5]; 注意,声明不要给与数组长度,因为此时还不分配内存;new时要指定长度。 将数组声明为Array和像String[]这样带中括号的,效果是一样...
阅读全文
摘要:12.1 枚举类型 强类型,枚举之间进行不能隐式转换 枚举类型直接派生于System.Enum,后者派生于System.ValueType,值类型,可以使用装箱/拆箱 不能定义方法/属性/事件。 同一个枚举中,多个枚举符号有相同的数值,数值转符号时,会返回其中第一个符号。 枚举类型要与使用它的类在同一级。 默认为int,可以指定枚举成员的类型,只有int,uint,byte,sbyte,...
阅读全文
摘要:自定义属性,使用声明式编程的方式,HTML也是属于这种编程方式。 17.1 使用自定义属性 只是将一些附加信息与某个目标元素关联起来。编译器在托管模块的元数据中生成额外的信息。 从System.Attribute派生,所有符合CLS的属性都是从这个基类派生。 有定位参数和命名参数两种,前者必须指定。 可以将多个属性应用于单个目标元素,用逗号分割。 17.2 定义自己的属性 属...
阅读全文
摘要:前言:System.Nullable在FCL中的实现: System.Nullable where T:struct,所以Nullable是一个值类型 有两个只读属性HasValue和Value,以及GetValueOrDefault方法 18.1 C#语法:Int32? 等价于 Nullable,于是可以有: Int32? a = 5; Int32? b = n...
阅读全文
摘要:泛型:支持值类型和引用类型,不支持枚举。 没有泛型属性。 泛型的好处: 源代码保护。使用泛型算法不需要访问算法的源码——相对于C++模板 类型安全——相对于ArrayList 更加清晰的源码——不需要拆箱,显示转换 更佳的性能——不用装箱。测试:循环1000万次,泛型List与ArrayList分别用时0.1s和2s 16.1 FC...
阅读全文
摘要:5.1基元类型 编译器(C#)直接支持的任何数据类型都称为基元类型(primitive type),基元类型直接映射到FCL中存在的类型。可以认为 using string = System.String;自动产生。 FCL中的类型在C#中都有相应的基元类型,但是在CLS中不一定有,如Sbyte,UInt16等等。 C#允许在“安全”的时候隐式转型——不会发生数据丢失,Int32可以转为Int64...
阅读全文
摘要:4.1 所有类型都派生自System.Object System.Object提供的方法:GetType(),ToString(),GetHashCode(),Equals(),MemberwiseClone(),Finalize() 所有对象都是用new操作符创建,创建过程: 1. 计算对象大小,包括“类型对象指针”和“同步块索引” 2.从托管堆分...
阅读全文
摘要:3.1 两种程序集,两种部署 CLR有两种程序集,弱命名程序集和强命名程序集,二者基本一样,区别:强命名程序集时用发布者的公钥/私钥对 进行了签名,唯一性的标识了程序集的发布者。弱命名程序集只能私有部署,强命名程序集可以使用全局部署,也可以私有部署。 3.2 为程序集指派强名称 一个强命名的程序集包括4部分重要属性,标志唯一:一个无扩展名的程序集,一个版本号,...
阅读全文