随笔分类 - CLR.框架学习
主要是.NET框架设计一书学习笔记。第一次要求自己读中文版;以后必须看英文版。
摘要:一、垃圾回收是只是回收引用类型实例、及实例的2个附件对象的所在的堆控件;值类型无无回收概念;值类型实例所占的内存是位于当前运行线程的堆栈上,当值类型实例变量所在的方法执行结束,他们的内存将随着堆栈空间的消亡而自动消失。二、垃圾回收是一件复杂的活,c#提供了GC(grabage collection)专门用于自动回收垃圾,的垃圾机制,垃圾回收一般被放在 Finalize、Dispose、close方法中。三、clr所需要的内存资源都是中托管堆分配的,当应用程序初始化后,clr将保留一块连续的地址空间。这端空间最初并不对应任何的物理内存,该地址空间即为托管堆,托管堆上维护一个指针(NextObjP
阅读全文
摘要:一、try catch 中的catch抛出异常必须是更具体的异常处理类,像父级异常处理抛出。就是说Exception应该是最后一个抛出的异常。在Exception抛出异常后,其后的异常将不处理。二、尽可能的不要把可能出现异常的代码块方法哦,finally中,即使finally出现异常,系统的异常机制继续工作,一个try块只能有一个finally,该块的代码一定被执行,在catch之后执行。三、Exception是所以异常的基类,System.SystemException 和System.ApplicationExcepion都继承自它。Fcl类型定义的方法抛出继承自System.System
阅读全文
摘要:一、委托是方法(静态方法、实例方法)的封装,我们把一个方法传递给委托后,该委托就指向一个具体的方法,在委托中写参数就如同像该方法中写参数,并指向该方法一样。二、申明委托编译器会将这行委托代码生成,4个方法:一个构造器、Invoke(和源代码中指定的原型一样,名称不同,而且是虚方法;参数、返回值和源代码定义一致)、BeginInvoke、EndInovke(BeginInvoke、EndInovke用于进行异步回调)。三。所以的委托都有一个构造器,并且该构造器接受2个参数:一个对象引用、一个指向回调方法的整数。四。所以的委托都继承自,MulticastDelegate,而MulticastDel
阅读全文
摘要:一、接口可以定义方法,属性、索引器、事件,并且自动默认public,不能加修饰符,当一个类实现某个接口时,其必须实现该接口定义的对象,还要实现该接口继承的接口的对象。二、如果一个类实现了多个接口,那么就可以将该类的实例重一个接口类型转换为另外一个接口类型,湖而建定义的总是虚方法,一个值类型转型为接口时,发生装箱操作。三、IS-A,是否继承关系:用基类;CAN-DO,能做:用接口;控件用的是继承,而集合(Collections)用的是接口,接口是一组行为的“集合”,约定大家都有这些行为。四、如果在基类中,添加新对象,派生类不用任何改变;如果是接口,则凡是继承了接口的类都必须修改代码来实现,接口中
阅读全文
摘要:一、数组是引用类型,值类型的数组也是引用类型。二、int[] myint; myint = new int[100]; 首先myint被神秘为一个指向元素类型int的一维数组变量,此时myint被设置为null。当分配100个int的数组时,所有这些int元素值都被初始化为0.虽然int属于值类型,单保存这些int值的内存块却是从托管堆中分配的。该内存包含100个为装箱的int值,最后代码返回保存这些int值的内存块地址,并将其保存在变量myint中。Control[] myCtr; myCtr= new Control[50];首先myCtr被设置为null,然后分配一个包含50个Contr
阅读全文
摘要:一、枚举:继承关系System.Object-->system.ValueType--->System.Enum(值类型),可对其进行格式化输出。二、判断一个枚举是否合法:Enum.IsDefined;枚举类型转换:Enum.Parse;可以把数值转换为枚举类型。三、位标记:定义一个枚举类型,在枚举类型上加上[Flags]属性。如: [Flags]enum Actions{Read =0X0001,Write=0X0002,Delete=0X0004,Query=0X0008,Sync=0X00010,}调用Actions actions=Actions.Read|Actions.
阅读全文
摘要:一、char 字符类型(他是值类型,strcut):3种转换类型方法:1.(int)char。 2.convert.ToInt()。3.IConvertlble,该接口实现了大量的类型间转换操作,FCL中的数值类型都实现了该接口。其公实现了:IComparable, IConvertible, IComparable<char>, IEquatable<char>几个接口。二、所有直接继承只System.Object的类型都是引用类型。郁闷吧。System.ValueType居然是引用类型,所有的值类型都是继承自它。三、string(密封类)共实现 IComparabl
阅读全文
摘要:一、 事件:允许对象登记事件;允许对象注销事件、允许定义事件的对象维持一个登记对象的集合,并在某些特定的事件发生时通知这些对象。clr的事件是建立在委托(delegate)上的。二、事件只能由事件的类型登记或者注销。事件其实是一个静态函数。三、事件继承自,Sysetm.EventArgs;命名规则是事件应该以EventArgs结尾。委托应该以EventHandler结尾。为的是命名标准。四、事件的本质是委托,定义一个事件时,c#编译器会生成1个委托类型的私有字段,一个add_+事件名,一个remover_+事件名的 2个public的方法。一个用于注册事件,一个用于注销事件。2个方法都有一个委
阅读全文
摘要:一、静态(类型)构造器不应该调用基类中的静态(类型)构造器,因为静态字段并没有被派生类继承(即在父类中定义的静态字段等对象,在其子类并不能访问。),一个类只能有一个静态构造器,并且必须是无参的。二、当需要在应用程序域关闭时执行某些代码用System.AppDomain的DomainUpload事件。三、CLR假设所有的方法参数都是按值来专递的。当参数是一样类型对象时,参数的传递可以通过传递指向对象的引用(或者指针)来完成。 对应值类型的参数来说,传递给方法的是将值类型实例的一个拷贝。这就是说,方法得到一份属于它自己的值类型实例拷贝,而调用该方法的代码中的实例不会受到任何影响。四、out:在调用
阅读全文
摘要:一、实例构造器:创建一个引用类型实例时,分三步1.为该实例分配内存 2.初始化对象的附近成员(方法表指针,SyncBlockIndex) 3.在调用类型的实例构造器设置对象的初始值。系统为该实例分配内存时总是把所有位上的值设置为0(二进制0),以保证构造器没有赋值的对象都有一个初始值0或者null;如果我们在申明类时没有申明构造器,系统将默认生成一个公有的无参数构造器。 实例值类型构造器:对于值类型 使用new仅仅是调用构造器,来初始化已经分配好的内存,为值类型定义任何构造器都必须初始化,值类型中的所有字段。c#不允许我们为值类型定义实例无参构造器(CLR可以为值类型定义无参构造器,所有可以用
阅读全文
摘要:一、const:常数,字段在编译时,直接把值嵌入到使用它的程序集中,就是说,如果只改名常数定义的程序集中常数的值,而不重新编译整个程序,那么以前引用该常数的程序集中该常数是保持以前的值,而不是重新编译后的值(俗称:版本问题)。二、字段:CLR支持有类型(静态)字段、实例字段(非静态);同时有分为只读字段(加上readonly)和读写字段;静态字段,系统在该类型被加载进入一个应用程序域时,动态分配内存。通常发生在引用该类型的方法第一次被jit编译时。实例字段,系统在该类型的实例被构造时动态为其分配内存。三、只需将一个字段申明为 静态只读(static readonly)字段即可以解决const带
阅读全文
摘要:比较两个对象相等、克隆 、是否允许实例化继承 CLR学习第六课 虚方法的Equeals、静态方法的Equals、==、引用类型相等ReferenceEquals;还有他们的一些重载方法。一、当我们重写Object中的Equeal方法时必须满足4条规则;1.必须自反,即自己和自己比较返回true;2.必须对此,比较2个类型时,交换位置都必须返回true;3.必须是可以传递的即a=b、b=c,那么a=c; 4.必须前后一致,也就是说,如果2个对象的值没有发生改变,多次调用Equeals方法都必须返回相同的值。 二、如果调用父类的Equals会导致调用Object.Equals方法,就不应该调用该.
阅读全文
摘要:一、基元类型:编译器直接支持的数据类型称为基元类型(如int类型其对于的是system。int32)。二、类型溢出,可以用checked 和unchecked进行类型溢出检查和不进行类型溢出检查。一个奇怪的问题,2个byte类型相加的结果居然是个int类型。如果原因是在clr(clr只在32位何64位进行算术运算)中计算时,要把byte类型先转换为32位的int类型在相加,所以导致2个byte类型相加的结果是int类型;一个诡异的问题 :如 a、b是byte类型 b+=a;则不会出错。三、所以的值计算都有对应的 System.Decimal是一个特殊的类型,clr没有直接操作Decimal的值
阅读全文
摘要:一、任何类,都继承或者间接继承自object类,其实万类之源。所以任何类都具有object类的属性和方法。equals、GetHashCode、ToString、GetType、MemberwiseClone、Finalize方法。二、当我们实例化一个类时,将从托管堆中,分配该类型所需要的空间;然后初始化对象成员,没一个实例化对象都有2个附件成员,第一个成员为指向类型方法的指针;第二个成员(SyncBlockindex),该字段用于线程同步,其中的某些位还用于垃圾处理时的标记;另外object的默认类型GetHashCode方法也用到了改字段。CLR使用这2个字段来管理对象实例。三、A--B:
阅读全文
摘要:一、代码的执行过程是调用方法的过程,当一个方法被第一次掉用时,Clr将检查该方法引用了那些类型,然后clr尝试加载被引用那个程序集的清单,如果方法引用的类型恰好在该文件中,clr将执行一些内部簿记工作,然后使用该类型。如果清单显示方法的引用类型在其他文件中,clr将试图加载这些文件,并做一些簿记工作,然后开始使用该类型。只有当引用一个类型的方法被调用时,clr才会加载该该类型所在的程序集。只意味着一个应用程序的的运行并不需要其引用的程序集中的所有文件。二、程序集版本号格式:主板本号.次版本号.生成版本号.修订号,如.NET2.0中 aspnet_isapi.dll的版本号为:2.0.50727
阅读全文
摘要:一、名称解释:CLS:common language specilication:通用语言规范;CLR:common language Runtime 公共语言运行时。托管代码:编译的代码直接clr等一层一层的进行 代码编译(C#--C#编译器--CLR(把它编译为IL)--IL--本地cpu可执行代码)并进行类型安全验证、资源释放等操作。非托管代码:c#语言生成的代码直接由cpu执行,所以需要自己处理资源释放、类型安全检查、等一系列的操作。元数据:包含程序运行所需的一切资源信息,元数据中包含3个表:定义表(Def)、引用表(Ref)、清单表。其中定义表、引用表:中分别包含了 模块(Modul
阅读全文
摘要:一、由于。net程序代码都是经过对应的编译器编译过的IL代码,而IL代码是依赖于机器上安装的.NETFramWork,所以只要机器上安装了.netFramwork就可以解析经过预编译后产生的Il代码。因为所有的.Net语言都是基于IL的,所有如果实现语言升级等问题,只需修改IL就可以对应语言的变化。二、开始加载dll或者exe文件时,从Mian方法入口,其中dll文件或者exe文件的头(PE)中包含有其执行所需要的资源的信息,其运行时需要元数据的支持。类中的一个方法如果被多次调用,则只有在第一次执行时,才完整的执行整个资源的加载过程,并且该方法保存在内存中。后面的调用如果检测到该方法的存在就直
阅读全文

浙公网安备 33010602011771号