2011年3月29日
摘要: 复制委托链上的委托对象 CLR默认的委托链调用处理在大多数情况下已经很好用了。但考虑一下以下的情况:希望获得委托链上每个回调方法的返回值?默认情况下我们只能获得最后一次调用的回调方法的返回值。被调用的委托中有一个抛出了异常。被调用的委托中有一个阻塞了很长时间。 由于委托链上的对象是按序调用的,所以如果有一个委托对象出了问题,将会阻止调用委托链上所有其他的委托对象。显然,这样的算法不够强健。 对于那些该算法不能满足的情况,MulticastDelegate类提供了一个实例方法GetInvocationList,我们可以使用它来显式调用委托链上的每一个委托对象。 该方法原型:public clas 阅读全文
posted @ 2011-03-29 22:49 辛勤的代码工 阅读(341) 评论(0) 推荐(0)
摘要: 委托判等 FCL中Delegate重写了Object的Equals虚方法,MulticastDelegate又重写了Delegate的Equals实现。MulticastDelegate重写的Equals方法在比较两个委托对象时会首先看它们的_target和_methodPtr字段是否都指向同样的对象和方法。如果这两个字段不匹配,那么返回false。如果这两个字段都匹配,那么再看两个委托对象是否为委托链表的头部(即_prec字段不为null)。如果两个委托对象的_prev字段指示的链表有相同的长度,且两个链表上对应委托对象的_target和_methodPtr字段也都互相匹配,那么Equals 阅读全文
posted @ 2011-03-29 22:09 辛勤的代码工 阅读(304) 评论(0) 推荐(0)
摘要: 让我们先看看以下示例代码:using System;using System.Collections.Generic;using System.Text;namespace DelegateTest{ //定义一个委托 public delegate void TestDelegate(int[] array); class Program { //定义一个数组,用于传递委托参数 static int[] array = new int[] { 1, 2, 3, 4, 5 }; //调用委托 static void Load(TestDelegate td) { if (td != null. 阅读全文
posted @ 2011-03-29 17:28 辛勤的代码工 阅读(361) 评论(0) 推荐(0)
摘要: 检测定制特性 定义一个特性类型本身没有什么用处,应用程序代码的行为不会因此有任何改变。 在枚举类型上应用Flags特性可以改变System.Enum.ToString、Format方法的行为,这是因为它们会在运行时检测所操作的枚举类型上是否应用了Flags特性。应用程序利用反射技术来查找目标元素上应用了哪些特性。 如果我们是微软公司负责实现Enum类型中Format方法的员工,我们可能会像下面这样来实现它:public static String Format(Type enumType, Object value, String format){ //检测传入的枚举类型是否应用了Flags类 阅读全文
posted @ 2011-03-29 14:39 辛勤的代码工 阅读(308) 评论(0) 推荐(0)
摘要: 自定义特性 假设我们是微软的员工,负责为枚举类型添加位标记支持。要实现这一点,我们首先定义一个FlagsAttribute类型: namespace System{ [AttributeUsage(AttributeTargets.Enum, Inherited = false)] public class FlagsAttribute : System.Attribute { public FlagsAttribute(){} }} 注意FlagsAttribute类型继承自System.Attribute,这使该特性成为一个与CLS兼容的定制特性。另外,所有的非抽象特性都必须具有publ. 阅读全文
posted @ 2011-03-29 12:26 辛勤的代码工 阅读(287) 评论(0) 推荐(0)
摘要: 定制特性仅仅是为目标元素提供关联附加信息的一种方式。编译器的工作只是将这些附加信息存放在托管模块的元数据中而已。大多数特性对编译器没有任何意义。编译器仅仅只是检测源代码中的定制特性,然后产生相应的元数据。 CLR允许将特性应用于任何可在一个文件的元数据中表示的元素(如:TypeDef、MethodDef、ParamDef、FieldDef、PropertyDef、EventDef、AssemblyDef、ModuleDef),也可以应该到元数据引用表中的条目上(如:AssemblyRef、ModuleRef、TypeRef、MemberRef),还可以应用到其他一些元数据中(如:安全许可、导. 阅读全文
posted @ 2011-03-29 11:38 辛勤的代码工 阅读(275) 评论(0) 推荐(0)
摘要: 接口仅仅是一个包含着一组虚方法的抽象类型。 接口中也可以定义事件、无参属性、含参属性(即索引器),因为它们都不过是映射到方法上的语法缩写而已。 接口类型的名称要加一个大写的字母I前缀。接口定义允许使用修饰符--如public、protected、private、internal。 一个值类型可以实现一个或多个接口,但当我们将一个值类型实例转型为一个接口类型时,该值类型实例必须被执行装箱。因为接口总被认为是引用类型,且它们定义的方法总是虚方法。未装箱的值类型没有指向类型方法表的指针。 当我们创建可扩展的应用程序时,接口应该处于中心位置。假设我们正在编写一个应用程序,且希望其他人创建的类型能被我. 阅读全文
posted @ 2011-03-29 00:23 辛勤的代码工 阅读(551) 评论(2) 推荐(0)