构造函数设计

注释

此内容由 Pearson Education, Inc. 的许可从 框架设计指南:可重用 .NET 库的约定、习惯和模式(第 2 版)重新打印。 该版于2008年出版,此后该书已于 第三版全面修订。 此页上的一些信息可能已过期。

有两种类型的构造函数:类型构造函数和实例构造函数。

类型构造函数是静态的,在使用该类型之前由 CLR 运行。 创建类型的实例时,实例构造函数将运行。

类型构造函数不能采用任何参数。 而实例构造函数可以。 不采用任何参数的实例构造函数通常称为无参数构造函数。

构造函数是创建类型实例的最自然方法。 大多数开发人员将在考虑创建实例(如工厂方法)的替代方法之前搜索并尝试使用构造函数。

✔️ 请考虑提供简单的(理想情况下为默认设置)构造函数。

简单的构造函数具有非常少量的参数,所有参数都是基元或枚举。 此类简单构造函数可提高框架的可用性。

✔️ 如果所需作的语义不直接映射到新实例的构造,或者遵循构造函数设计准则感觉不自然,请考虑使用静态工厂方法而不是构造函数。

✔️ 请使用构造函数参数作为设置主属性的快捷方式。

使用后跟一些属性集的空构造函数和使用带有多个参数的构造函数在语义上应该不存在任何差异。

✔️ 如果构造函数参数用于仅设置属性,则对构造函数参数和属性使用相同的名称。

此类参数和属性的唯一区别应该是大小写形式。

✔️ 在构造函数中执行最少的工作。

除捕获构造函数参数外,构造函数不应执行太多工作。 任何其他处理的成本都应延迟到需要为止。

✔️ 在适当情况下,应从实例构造函数抛出异常。

✔️ 如果需要此类构造函数,请显式声明类中的公共无参数构造函数。

如果未在类型上显式声明任何构造函数,则多种语言(如 C#)将自动添加公共无参数构造函数。 (抽象类获取受保护的构造函数。

将参数化构造函数添加到类可防止编译器添加无参数构造函数。 这通常会导致意外的中断性变更。

❌ 避免在结构上显式定义无参数构造函数。

这使得数组创建速度更快,因为如果未定义无参数构造函数,则不必在数组中的每个槽上运行它。 请注意,许多编译器(包括 C#)不允许结构具有无参数构造函数,原因如下。

❌ 避免在其构造函数内对对象调用虚拟成员。

调用虚拟成员将导致调用派生度最高的替代,即使派生度最高的类型的构造函数尚未完全运行也是如此。

类型构造函数指南

✔️ 将静态构造函数设为私有。

静态构造函数(也称为类构造函数)用于初始化类型。 CLR 会在首次创建该类型实例或首次调用该类型的静态成员之前调用静态构造函数。 用户无法控制何时调用静态构造函数。 如果静态构造函数不是专用构造函数,则可以通过 CLR 以外的代码调用它。 根据在构造函数中执行的操作,这可能会导致意外行为。 C# 编译器强制静态构造函数是私有的。

❌ 请勿从静态构造函数引发异常。

如果从类型构造函数引发异常,则此类型在当前应用程序域中不可用。

✔️ 请考虑内联初始化静态字段,而不是显式使用静态构造函数,因为运行时能够优化没有显式定义的静态构造函数的类型的性能。

部分内容 © 2005, 2009 Microsoft 公司。 保留所有权利。

获得皮尔逊教育公司许可后重印自 框架设计准则:可重用 .NET 库的约定、习惯和模式 ,由 Krzysztof Cwalina 和 Brad Abrams 编写,并作为微软 Windows 开发系列中的出版物之一,于 2008 年 10 月 22 日由 Addison-Wesley Professional 出版。

另请参阅