ASP.NET Lab

The Best Web, The Best Future

指南 / 类库开发

摘要: 使用超时来指定调用者将要在一个方法的调用被完成时的最大等待时间。阅读全文
posted @ 2007-02-05 18:34 Laeb| 编辑

摘要: 提示:关于使用 C++ 进行最终处理的信息,请参考:[Visual C++ 中的析构器与最终清理器]。阅读全文
posted @ 2007-02-05 17:43 Laeb| 编辑

摘要: 下列规则概述了实现 Equals 方法与等式操作符(==)的指南:阅读全文
posted @ 2007-02-04 15:58 Laeb| 编辑

摘要: 关于实现等式操作符(==)的相关信息,请参考:[Equals 与等式操作符(==)的实现指南]。阅读全文
posted @ 2007-02-04 15:44 Laeb| 编辑

摘要: .NET Framework 允许开发者创造新的声明信息、为不同的程序实体指定声明的信息,并且从运行时环境中获取特性信息。例如,一个框架可能定义了一个能够被存放到程序元素(如类与方法)中来提供程序元素的说明文档映射的 HelpAttribute 特性。新的声明信息是通过特性类的声明而被定义的,并且还可能拥有被命名的位置参数。关于特性的更多信息,请参考:[编写自定义特性]。阅读全文
posted @ 2007-02-04 15:39 Laeb| 编辑

摘要: 关于数组与数组用法的常规描述,请参考:[Arrays]与[System.Array 类]。阅读全文
posted @ 2007-02-03 20:44 Laeb| 编辑

摘要: 抛出异常能够消极地影响到性能。关于常规的代码故障,你可以使用设计模式来把性能问题减到最少。本文描述了两个在异常可能严重地影响到性能时比较有用的设计模式。阅读全文
posted @ 2007-02-03 16:43 Laeb| 编辑

摘要: 下列指导方针有助于确保你的自定义异常是正确被设计的。阅读全文
posted @ 2007-02-03 16:43 Laeb| 编辑

摘要: 下列指导方针为 .NET Framework 所提供的一些最常用的异常而描述了最佳的实践。关于 .NET Framework 所提供的完整的异常类列表,请参考:[.NET Framework 类库参考文档]。阅读全文
posted @ 2007-02-03 16:41 Laeb| 编辑

摘要: 下列指导方针有助于确保你的库适当地处理了异常。阅读全文
posted @ 2007-02-03 16:40 Laeb| 编辑

摘要: 下列指导方针有助于确保你的异常消息是有意义的并且拥有正确的格式。阅读全文
posted @ 2007-02-03 16:40 Laeb| 编辑

摘要: 要包装一个异常,你应该把它指定为新异常的内部异常然后抛出这个新的异常。这个实践应该只在原始异常不能够为接收者传达足够含意,或者该异常的调用堆栈是令接收者费解的或者是没有兴趣的情形之下才被使用。例如,考虑一个为了管理基于 XML 的配置文件而提供了功能的库。其中,配置文件管理器使用一个 XML 读取器来读取文件。如果某个配置文件拥有错误的格式,那么 XML 读取器就可以抛出一个为 XML 读取器和它所支持的类型而包括了一条消息和调用堆栈细节的异常,并且这个被抛出的异常对于应用程序的用户来说是毫无意义的。因此,在这种情节中就比较适合为配置文件管理器而包装 XML 读取器的异常并且重新抛出一个以真实自然的方式来表述问题的新异常。阅读全文
posted @ 2007-02-03 16:38 Laeb| 编辑

摘要: 下列设计指导方针有助于确保你对现有的异常进行了适当的使用,并且在它们为你的库添加值的时候创建新的异常。阅读全文
posted @ 2007-02-03 16:38 Laeb| 编辑

摘要: 异常会在成员无法成功地完成被设计的任务时被抛出。这表示出现了执行故障。例如,如果 Connect 方法不能够连接到被指定的远程终端,那么就会引起执行故障并且抛出一个异常。阅读全文
posted @ 2007-02-03 16:36 Laeb| 编辑

摘要: 你可以通过密封成员的方式来限制开发者对你的库的扩展方式。在你密封一个类的时候,其他类就不能够从它那里继承。在你密封一个成员的时候,派生类就不能够重载该成员的实现。默认时你不应该密封任何类型和成员。密封可以防止针对于库类型和成员的定制,并且会影响一些开发者对于可用性的理解。另外,可扩展性是使用面向对象框架的一种基本利益。你应该不要随意地对这种利益进行约束。阅读全文
posted @ 2007-02-02 16:55 Laeb| 编辑

摘要: 抽象化实现的基类是被设计成用来协助开发者实现抽象类和接口(抽象化)的类。它们为抽象化而提供了实现的细节并且在一些情况下它们是不需要进行继承就是能够被使用的。例如,Collection 能够被用来创建一个集合或者能够被继承来定义一个被强类型化的集合类。阅读全文
posted @ 2007-02-02 16:54 Laeb| 编辑

摘要: 抽象类型与接口都是用来指定可编程抽象化的机制。抽象化指定了继承者或实现者都必须坚持的约定。抽象类型能够拥有对提供实现细节的选择权;而接口则不能够提供任何的实现细节。阅读全文
posted @ 2007-02-02 16:53 Laeb| 编辑

摘要: 虚拟(在 Visual Basic 中是 Overridable)成员允许你通过提供不同的成员实现来改变成员的行为。它们通常在需要该类的派生类来处理给定的特殊情节时被使用。例如,WebRequest 类为了把请求发送到任何通用资源标识符(URI)而定义了功能。而 FtpWebRequest 类就是 WebRequest 的派生类,后者通过重载前者的虚拟方法来处理把请求发送到使用了文件传输协议(FTP)结构的 URI 中。阅读全文
posted @ 2007-02-02 16:52 Laeb| 编辑

摘要: 回调方法是一种在操作或行为被完成的时候通过委托而自动被调用的方法。例如,一个异步设计模式使用了被称作 AsyncCallback 的委托来指定在异步操作被完成的时候所执行的代码。这个设计模式被用在 BeginWrite 方法中,这个方法使用一个回调来处理来自于异步写入操作的结果。阅读全文
posted @ 2007-02-02 16:51 Laeb| 编辑

摘要: 未被密封的类中的被保护成员能够给予开发者一种方式来定制类的行为。例如,用来触发事件的方法经常以被保护的方式而被定义并且允许派生类在事件被触发之前或在事件已触发之后来提供附加的处理。阅读全文
posted @ 2007-02-02 16:50 Laeb| 编辑

摘要: 未密封的类允许其他的类从它那里进行继承。许多其他的可扩展性机制(如被保护的成员和虚拟成员)都需要一个未被密封的类。这些附加的机制添加了一种强大的方式来添加或自定义类型的功能,但是需要付出重大的代价。未被密封的类在许多开发情节中是有用的,即使它没有附加的可扩展性机制。阅读全文
posted @ 2007-02-02 16:49 Laeb| 编辑

摘要: 指针是一个高级的编程特征,并且只应该在要求临界的性能情况下才被使用。指针允许对内存进行访问。下列指导方针有助于确保你的库设计中有效地使用了指针。阅读全文
posted @ 2007-02-01 20:07 Laeb| 编辑

摘要: 数组被用来把一个可变数量的参数传递给成员。在 CLR 中,一些编程语言(如 C#)提供了一个用来为传递可变参量的数组进行修饰的关键字。而对于没有提供这种关键字的编程语言,则能够使用 ParamArrayAttribute 特性来提供这个功能。这些关键字和特性能够影响到成员签名中排在最后的参数,并且这个参数还必须是一个单维数组。阅读全文
posted @ 2007-02-01 20:06 Laeb| 编辑

摘要: 方法的参数能够通过值、通过引用,或者作为输出参数而被传递。在通过值来传递参数的时候,方法会获取对于调用者数据的一个复制并且不会改变调用者的数据。在通过引用传递参数的时候,方法会获取调用者数据的一个指针,并且与调用者一起共享该数据。如果方法改变了参数所引用的内容,那么这个变化同样会作用于调用者的数据。在使用引用参数的时候,最初的数据状态能够通过该方法被使用。输出参数则与引用参数类似,区别就是输出参数在直到把数据返回到调用者之前都是被独占使用的,而引用参数既能够用来把数据传递给方法也能够从方法中接收数据。阅读全文
posted @ 2007-02-01 20:05 Laeb| 编辑

摘要: 下列指导方针有助于确保你能够正确地对参量进行验证。阅读全文
posted @ 2007-02-01 20:05 Laeb| 编辑

摘要: 下列指南有助于检测一个参数的类型是否应该是一个枚举还是 Boolean 值。阅读全文
posted @ 2007-02-01 20:04 Laeb| 编辑

摘要: 本文中的这个指南有助于你为成员参数选择正确的类型和名称。下列文章同样呈现了参数的设计指导方针。阅读全文
posted @ 2007-02-01 20:03 Laeb| 编辑

摘要: 转换操作符用来把一个对象从一种类型转换到另外一种类型。转换操作符可以是隐式的也可以是明确的。隐式的转换操作符不需要在源代码中指定一个类型转换来完成转换任务。而明确的转换操作符则需要在源代码中呈现一个类型转换来完成转换任务。阅读全文
posted @ 2007-02-01 20:02 Laeb| 编辑

摘要: 操作符重载允许类型能够被组合并且能够通过操作符(如 "+"、"-"、"=",以及 "!=")来进行比较。通过添加类型的操作符重载,你可以允许开发者把它当成一个内建的简单类型来使用。操作符重载应该只在为类型表示直觉操作的时候才被完成(例如,支持加法操作的一个数值类型的两个实例)。操作符重载不应该被用来为非直觉的操作而提供一个依据造句法的快捷方式。阅读全文
posted @ 2007-02-01 20:01 Laeb| 编辑

摘要: 字段用来保持与对象相关联的数据。在大多数情节下,库中的任何非静态字段都应该是对于开发者不可见的。下列指导方针有助于你在库设计中正确地使用字段。阅读全文
posted @ 2007-02-01 20:00 Laeb| 编辑

摘要: 如果你没有使用常规的 EventHandler 代理,那么下列指南将有助于你正确地设计事件处理器。阅读全文
posted @ 2007-02-01 19:59 Laeb| 编辑

摘要: 事件是允许在动作发生的时候执行特殊应用程序代码的机制。事件既能够发生在被关联的动作发生之前(之前事件)又能够发生在动作发生之后(之后事件)。例如,当用户在窗口中单击一个按钮的时候,一个之后事件就被触发来允许执行特殊的应用程序方法。事件处理器的代理会绑定到将要在系统触发一个事件时被执行的方法。事件处理器被添加到事件,因此它能够在事件被触发的时候调用它的方法。并且事件还能够拥有特殊的事件数据(例如,一个鼠标单击事件能够包括与屏幕鼠标的位置有关的数据)。阅读全文
posted @ 2007-02-01 19:58 Laeb| 编辑

摘要: 类型构造器被用来初始化类型中的静态数据。类型构造器在该类型的任何实例被创建之前通过公共语言运行时(CLR)而被调用。类型构造器是静态的(在 Visual Basic 中是 Shared)并且不能够获取参数。阅读全文
posted @ 2007-01-31 19:36 Laeb| 编辑

摘要: 构造器是用来初始化类型并为类型创建实例的特殊方法。类型构造器被用来初始化类型中的静态数据。类型构造器在该类型的任何实例被创建之前都会通过公共语言运行时(CLR)被调用。类型构造器是静态(在 Visual Basic 中是 Shared)的并且不能够获取参数。而实例构造器则被用来创建类型的实例。实例构造器能够获取参数,但是这样做并不是必需的。并且没有参数的实例构造器会调用默认的构造器。阅读全文
posted @ 2007-01-31 19:34 Laeb| 编辑

摘要: 属性变化的通知事件用来把通过内部或外部行为所导致的属性值的变化情况通知给代码。这样做能够允许代码对必需的相关状态进行更新(例如,通过提醒用户界面中的控件外观)。阅读全文
posted @ 2007-01-31 19:34 Laeb| 编辑

摘要: 索引属性允许以数组的方式来访问子项的分组(例如,字符串中的字符或 BitArray 中的位)。索引属性被称为索引器或默认属性,与常规属性不同的是:它们通过获取参数的方式来表示分组中的哪一个元素将要被访问。索引属性的实现应该尽可能地简单化,因为索引器经常在循环中被使用。下列指南有助于确保你的类型中适当地包含了良好定义的索引。阅读全文
posted @ 2007-01-31 19:31 Laeb| 编辑

摘要: 通常,方法用来呈现动作而属性用来呈现数据。并且属性能够与字段一样被使用,因此说明了属性不应该是复杂的计算或者会导致副作用的。关于属性设计的附加信息,请参考:[索引属性的设计]和[属性变化的通知事件]。阅读全文
posted @ 2007-01-31 19:30 Laeb| 编辑

摘要: 通常,方法用来呈现动作而属性用来呈现数据。并且属性能够与字段一样被使用,因此说明了属性不应该是复杂的计算或者会导致副作用的。在不违反下列指南的时候,考虑属性的使用会胜于方法,因为有较少体验的开发者会发现属性是更加容易被使用的。阅读全文
posted @ 2007-01-30 20:14 Laeb| 编辑

摘要: 接口是一种支持功能的约定。实现了接口的类必须为接口中被指定的成员提供实现的细节。例如,IEnumerator 接口定义了一个必须实现并且通过一个对象集(如集合)来支持枚举操作的成员签名。要实现 IEnumerator 接口,派生类就必须实现 Current、MoveNext,以及 Reset 成员。阅读全文
posted @ 2007-01-30 20:13 Laeb| 编辑

摘要: 成员的签名中包括了名称和参数列表。每个成员的签名都必须是唯一的类型。但是只要它们的参数列表不相同,成员就能够拥有相同的名称。在类型中有两个或多个成员是相同的成员种类(方法、属性、构造器,以及等等)并且拥有相同的名称和不同的参数列表的时候,那么这个成员就可以说是被重载的。例如,Array 类包含了两个 CopyTo 方法。第一个方法获取一个数组和一个 Int32 的值,而第二个方法则获取一个数组和一个 Int64 的值。阅读全文
posted @ 2007-01-29 21:42 Laeb| 编辑

摘要: 被嵌套的类型是一些其他类型的成员类型。被嵌套的类型应该与它们的声明类型进行紧耦合并且不能与常规类型一样是可用的。被嵌套的类型容易被一些开发者所混淆并且不能够是公开可见的,除非有一个强制性的原因要这样做。在一个设计良好的库中,开发者应该极少地使用被嵌套的类型来实例化对象或声明变量。阅读全文
posted @ 2007-01-29 20:12 Laeb| 编辑

摘要: 下列指南讨论了为库用户介绍的一个潜在的变化。如果你把值添加到先前已被承载的枚举中,那么现有的应用程序代码将不再是足够健壮的也不能够优雅地对新值进行处理。阅读全文
posted @ 2007-01-29 20:11 Laeb| 编辑

摘要: 标记枚举被用来屏蔽位字段并且完成位比较操作。它们被正确设计并在同时能够指定多个枚举值的时候被使用。例如,你可以对任何 GenericUriParserOptions 枚举值进行组合来配置一个常规的统一资源标识符(URI)处理器。阅读全文
posted @ 2007-01-29 20:10 Laeb| 编辑

摘要: 枚举提供了为强类型成员所用的常量值集合并且改进了代码可读性。枚举既可以是简单的也可以是标记。简单的枚举包含了没有在位比较操作中被组合或被使用的值。而标记枚举则是通过使用位比较操作关键字 OR 而有意被组合的。通过使用位比较操作关键字 AND 还可以对标记枚举的组合值进行检查。阅读全文
posted @ 2007-01-29 20:09 Laeb| 编辑

摘要: 结构是属于值类型。它们被分配在堆栈或者内嵌空间中并且在它们超出了使用范围时候会被清除。通常,值类型的分配与清除的代价是比较小的;但是,如果它们在需要进行大量的装箱与拆箱操作的开发情节中被使用的时候,它们就会与被用来比较的引用类型一样蹩脚地被完成。关于更多信息,请参考:[C# 编程指南:装箱与拆箱]。阅读全文
posted @ 2007-01-29 20:08 Laeb| 编辑

摘要: 接口为实现者必须要提供的成员集合而定义了签名。并且不能够为接口的成员提供实现的细节。例如,ICollection 接口就定义了与集合操作相关的成员。每个实现了接口的具体类都必须为这些成员而提供具体的实现细节。虽然被派生的类只能够从一个单独的类进行继承,但是它们能够同时实现多个接口。下列指南有助于确保你的接口是被正确设计的。阅读全文
posted @ 2007-01-29 12:39 Laeb| 编辑

摘要: 静态类与那些被继承自 Object 的类不同的是:它是一种不包含实例成员的类,并且没有可调用的构造器。下列指导方针有助于确保你的静态类是正确地被设计的。阅读全文
posted @ 2007-01-29 11:54 Laeb| 编辑

摘要: 因为抽象类从来都不会被例示,因此正确地定义它们的构造器是重要的。同样重要的是:确保抽象类的功能是正确的并且是易于被扩展的。下列指南有助于确保抽象类正确地被设计并且在被实现的时候能够如被期望的那样工作。阅读全文
posted @ 2007-01-28 23:20 Laeb| 编辑

摘要: 接口对必须由实现者所提供的成员集合的签名进行定义。接口不能够为成员提供实现的细节。例如,ICollection 接口定义了与集合操作相关的成员。实现了接口的每一个类都必须为这些成员提供实现细节。并且一个类能够实现多个接口。阅读全文
posted @ 2007-01-28 20:46 Laeb| 编辑

摘要: 类是属于引用类型而结构是属于值类型。引用类型被分配在堆中,并且内存管理会通过垃圾回收器而被处理。而值类型则被分配在堆栈或内嵌空间中并且在它们超出作用范围时候会被清除。通常,值类型的分配与清除是更加廉价的操作。但是,如果它们被用在需要进行大量的装箱与拆箱操作的情节中时,它们将与被比较的引用类型一样蹩脚地被完成。关于更多信息,请参考:[装箱与拆箱(C# 编程指南)]。阅读全文
posted @ 2007-01-28 18:19 Laeb| 编辑

摘要: 子命名空间是存在于命名空间中的命名空间。它们被用来对开发者必须进行检查以查找正确的类型并用于公共的编程任务的类型的数量进行限制。下列指南有助于把特定的类型组织到主特征命名空间之下的众所周知的命名空间中。阅读全文
posted @ 2007-01-28 17:48 Laeb| 编辑

摘要: 下列指导方针有助于你对类型和命名空间进行组织,因此它们能够易于被查找和使用。阅读全文
posted @ 2007-01-28 17:33 Laeb| 编辑

摘要: 本文中的指导方针适用于本地化资源(如错误消息和菜单文本)。阅读全文
posted @ 2007-01-28 17:04 Laeb| 编辑

摘要: 选择好的参数名称能够极大地改进库的可用性。一个好的参数名称应该能够表示出通过参数而被影响的数据或功能。阅读全文
posted @ 2007-01-28 16:41 Laeb| 编辑

摘要: 类型成员包含了下列不同的种类:方法、属性、字段,事件阅读全文
posted @ 2007-01-28 15:51 Laeb| 编辑

摘要: 通常,类型的名称应该是名词短语,而名词又是通过类型而被呈现的实体。例如,Button、Stack,以及 File 都各自拥有通过类型被呈现的实体而定义的标识名称。从开发者的观点出发而选择实体的标识名称;并且名称还应该反映出使用情节。阅读全文
posted @ 2007-01-28 11:42 Laeb| 编辑

摘要: 已选择的命名空间名称应该可以表示功能能够通过对命名空间中的类型进行引用的方式而变得可用。例如,System.Net.Sockets 命名空间包含了允许开发者使用套接字来作为通过网络进行通信的类型。阅读全文
posted @ 2007-01-27 21:30 Laeb| 编辑

摘要: 在大部分情节中,汇编集包含了所有或者部分可重用的库并且这些库被包含在一个单独的动态链接库(DLL)中。一个汇编集能够分离到多个 DLL 之中,但是这却是非常罕见的并且不会在这个指导方针中被讨论。阅读全文
posted @ 2007-01-27 19:47 Laeb| 编辑

摘要: 常规命名约定讨论了如何为你的库元素选择最好的名称。这些指导方针适用于所有的标识符。稍后的部分将讨论如何命名特定的元素(如命名空间或属性)。阅读全文
posted @ 2007-01-27 16:42 Laeb| 编辑

摘要: 大多数命名约定都适合于对标识符进行字母大小写包装。重要的注意事项就是公共语言运行时环境(CLR)能够同时对字母大小写敏感和对字母大小写不敏感的语言提供支持。在本文中被描述的大写字母约定为开发者对类库的理解以及操作变得更简单。阅读全文
posted @ 2007-01-26 18:12 Laeb| 编辑

摘要: 命名指导方针为组成类库结构的元素(包括汇编集、命名空间、类型、成员,以及参数)而选择适当的标识符提供了指导。选择遵循了这些指导方针的标识符能够为你的类库改进可用性并且鼓励用户能够在无需学习一种新的编程约定的情况下就能够对你的类库产生信任。阅读全文
posted @ 2007-01-26 13:20 Laeb| 编辑

摘要: 针对于类库开发的设计指导方针能够对 .NET Framework 进行扩充并与之进行交互。.NET Framework 设计指导方针的目标就是帮助类库开发者确保他们的用户能够从 API 的一致性以及能够提供统一的、方便易用的,且依赖于被使用的编程语言的编程模型中受益。强烈建议开发者在开发扩充 .NET Framework 的类和组件的时候遵循这些设计指导方针。不一致的类库设计将会影响开发者的生产力并阻碍类库的应用。阅读全文
posted @ 2007-01-26 12:43 Laeb| 编辑