上一页 1 ··· 7 8 9 10 11 12 13 14 下一页
  2011年3月30日
摘要: 类库开发人员使用异常的指导原则避免过多的finally块可以使用using语句来减少finally代码块。避免捕获所有异常如果我们设计的类型是一个类库的一部分,那么它绝对不应该捕获所有的异常(即捕获System.Exception),因为它不可能知道应用程序会如何处理这些异常。如果应用程序代码抛出了一个异常,应用程序的另一部分很可能期望能捕获该异常。这时我们应该让异常按照筛选器的筛选规则沿着调用堆栈向更高一层传递,直至找到能够处理它的应用程序代码。从异常中顺利的恢复我们捕获某个特定的异常时,应该完全理解导致抛出异常的情况,并清楚哪些异常类型继承自我们所捕获的异常。当异常无法修复时,回滚部分完成 阅读全文
posted @ 2011-03-30 11:30 辛勤的代码工 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 异常简介 C#只能抛出与CLS兼容的异常,即从System.Exception继承的异常类型。但CLR允许抛出任何类型的对象。C#为我们提供了一种特殊的catch块来捕获与CLS不兼容的异常: catch //这里没有指定异常筛选器{ //这里执行恢复代码 ....} 这样的catch块也可捕获任何与CLS兼容的异常。 finally块中的代码执行的是一些资源清理操作,这些清理操作通常是对应的try块中的行为所需要的。 异常是对程序接口隐含假设的一种违反。 在设计一个类型时,我们应该首先假设类型最常见的使用方式,然后设计其接口使之能够很好地处理这种情况。最后再考虑接口带来的隐含假设,并且当任何 阅读全文
posted @ 2011-03-30 10:50 辛勤的代码工 阅读(491) 评论(0) 推荐(0) 编辑
  2011年3月29日
摘要: 复制委托链上的委托对象 CLR默认的委托链调用处理在大多数情况下已经很好用了。但考虑一下以下的情况:希望获得委托链上每个回调方法的返回值?默认情况下我们只能获得最后一次调用的回调方法的返回值。被调用的委托中有一个抛出了异常。被调用的委托中有一个阻塞了很长时间。 由于委托链上的对象是按序调用的,所以如果有一个委托对象出了问题,将会阻止调用委托链上所有其他的委托对象。显然,这样的算法不够强健。 对于那些该算法不能满足的情况,MulticastDelegate类提供了一个实例方法GetInvocationList,我们可以使用它来显式调用委托链上的每一个委托对象。 该方法原型:public clas 阅读全文
posted @ 2011-03-29 22:49 辛勤的代码工 阅读(336) 评论(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 辛勤的代码工 阅读(295) 评论(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 辛勤的代码工 阅读(355) 评论(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 辛勤的代码工 阅读(305) 评论(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 辛勤的代码工 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 定制特性仅仅是为目标元素提供关联附加信息的一种方式。编译器的工作只是将这些附加信息存放在托管模块的元数据中而已。大多数特性对编译器没有任何意义。编译器仅仅只是检测源代码中的定制特性,然后产生相应的元数据。 CLR允许将特性应用于任何可在一个文件的元数据中表示的元素(如:TypeDef、MethodDef、ParamDef、FieldDef、PropertyDef、EventDef、AssemblyDef、ModuleDef),也可以应该到元数据引用表中的条目上(如:AssemblyRef、ModuleRef、TypeRef、MemberRef),还可以应用到其他一些元数据中(如:安全许可、导. 阅读全文
posted @ 2011-03-29 11:38 辛勤的代码工 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 接口仅仅是一个包含着一组虚方法的抽象类型。 接口中也可以定义事件、无参属性、含参属性(即索引器),因为它们都不过是映射到方法上的语法缩写而已。 接口类型的名称要加一个大写的字母I前缀。接口定义允许使用修饰符--如public、protected、private、internal。 一个值类型可以实现一个或多个接口,但当我们将一个值类型实例转型为一个接口类型时,该值类型实例必须被执行装箱。因为接口总被认为是引用类型,且它们定义的方法总是虚方法。未装箱的值类型没有指向类型方法表的指针。 当我们创建可扩展的应用程序时,接口应该处于中心位置。假设我们正在编写一个应用程序,且希望其他人创建的类型能被我. 阅读全文
posted @ 2011-03-29 00:23 辛勤的代码工 阅读(541) 评论(2) 推荐(0) 编辑
  2011年3月28日
摘要: 数组的传递与返回 如果我们定义了一个返回数组引用的方法,而在某些情况下数组又不含任何元素,那么我们的方法即可返回一个null,也可返回一个长度为0的数组引用。当我们实现这样的方法时,微软强烈建议我们让该方法返回一个0长的数组,因为这样会简化调用该方法的开发人员的编码工作。 同理,我们应该以同样的方式来处理字段。创建下限非0的数组 使用Array.CreateInstance静态方法可以动态创建下限非0的数组。 示例代码: 可使用Array.GetLowerBound和Array.GetUpperBound方法来获取此类数组的上下限索引号,以方便编码。快速访问数组 我们每次访问一个数组中的元素时 阅读全文
posted @ 2011-03-28 22:26 辛勤的代码工 阅读(321) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 下一页