2011年3月27日
摘要: 有时我们会感到编译器自动产生的add和remove方法不够理想。如:我们需要频繁地添加或移除委托实例,同时我们又知道我们的程序是在单线程环境下运行,这时再对包含委托实例的对象进行同步访问的话就会损伤应用程序性能。 C#编译器允许我们显式实现add和remove访问器方法。示例代码如下:public class MailManager{ public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); //显式定义一个私有委托链表字段 private MailMsgEventHandler mailM. 阅读全文
posted @ 2011-03-27 21:59 辛勤的代码工 阅读(297) 评论(0) 推荐(0)
摘要: 完整定义一个事件的方法 以Mail发送为例:定义一个类型用于保存所有需要发送给事件通知接受者的附加信息。按.Net框架约定,所有保存事件信息的类型都应该继承自System.EventArgs,且类型的名称应该EventArgs结束。 public class MailMsgEventArgs : EventArgs { public readonly string from, to, subject, body; public MailMsgEventArgs(string from, string to, string subject, string body) { this.from = 阅读全文
posted @ 2011-03-27 21:39 辛勤的代码工 阅读(340) 评论(0) 推荐(0)
摘要: 当定义一个属性时,编译器会在生成的托管模块中产生以下3项:一个表示属性的get访问器的方法。只有为属性定义了get访问器方法时,才有这一项。一个表示属性的set访问器的方法。只有为属性定义了set访问器方法时,才有这一项。一个位于托管模块元数据中的属性定义,不管是只读、只写、或读写属性都有这一项。 阅读全文
posted @ 2011-03-27 15:51 辛勤的代码工 阅读(310) 评论(0) 推荐(0)
摘要: CLR提供了两个IL指令来调用方法:call和callvirt。 call指令根据引用变量的类型来调用一个方法。 callvirt指令根据引用变量指向的对象类型来调用一个方法。 当编译源代码时,编译器知道代码中是否在调用一个虚方法,并据此产生call或callvirt指令。产生call而不是callvirt会提高代码的性能,因为CLR不必检查引用对象的实际类型。 不管最终是通过call还是callvirt来调用一个实例方法,所有的实例方法调用都会接受一个隐藏的this指针作为方法的第一个参数,其中this指针指向当前正在操作的对象。 阅读全文
posted @ 2011-03-27 15:23 辛勤的代码工 阅读(305) 评论(0) 推荐(0)
摘要: 操作符重载方法: CLR对操作符重载一无所知,它甚至都不认识操作符是什么。我们选择的编译语言定义了每个操作符的含义,以及当遇到它们时产生什么样的代码。 如在C#中,应用于基元数值类型上的+符号会使编译器产生将两个数相加的代码。 虽然CLR对操作符一无所知,但它却规范了编程语言应该怎样提供操作符重载。对于CLR来讲,重载操作符仅仅是一些方法而已。 以下代码:class Complex{ public static Complex operator+(Complex c1, Complex c2) {......}} 编译器会产生一个名为op_Addition的方法定义,该方法定义条目上有一个sp 阅读全文
posted @ 2011-03-27 15:14 辛勤的代码工 阅读(351) 评论(0) 推荐(0)
摘要: 除实例构造器外,CLR还支持类型构造器(又称静态构造器、类构造器、类型初始化器)。类型构造器用于设置一个类型的初始状态。默认情况下,一个类型中没有定义类型构造器,只能手动定义。且类型构造器不能有任何参数。 示例代码如下:class SomeRefType{ //当SomeRefType第一次被访问时执行 static SomeRefType() {}}struct SomeValType{ //当SomeValType第一次被访问时执行 static SomeValType() {}} 类型构造器不允许添加任何访问限制符,它的访问限制被自动设为私有方式。类型构造器的调用由CLR负责,CLR会. 阅读全文
posted @ 2011-03-27 12:24 辛勤的代码工 阅读(291) 评论(0) 推荐(0)