ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

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

提示:改变方法的返回类型并不会使该方法与公共语言运行时规范的出发点一样变得唯一。你不能够定义只通过返回值而变化的重载。

被重载的成员应该在相同的功能上提供变化。例如,为一个类型拥有两个同样名为 CopyTo 的成员将不再是不正确的,第一个成员把数据复制到一个数组而第二个则把数据复制到一个文件。成员重载的一个公共用途就是提供获取少量参数或没有参数并且易于使用的重载。这些成员会对更多强大的重载进行调用,但是同样需要更多的体验来正确使用。这些易于使用的重载通过把默认值传递到复杂重载中的方式来支持公共的开发情节。例如,File 类为 Open 方法提供了重载。简单的 Open 重载获取一个文件路径和文件模式。它会调用获取路径、文件模式、文件访问,以及文件共享参数的 Open 重载,并为文件访问和文件共享参数提供公共被使用的默认值。开发者不需要复杂重载的灵活性也不需要在他们能够打开文件之前去学习关于文件的访问和共享模型。

为了维护和翻译的轻松,较简单的重载应该使用复杂的重载来完成它们的动作;并且底层的功能不应该在多个位置被实现。

下列指导方针有助于确保你的被重载成员是设计良好的。

尝试使用描述性的参数名称来表示通过较简单的重载被使用的默认值。

这个指导方针对于 Boolean 参数来说是最适用的。较复杂重载的参数名称应该能够表示出较简单重载通过对相对状态或动作进行描述而被提供的默认值。例如,String 类提供了下列重载:

public static int Compare(
   string strA,
   string strB
);

public static int Compare(
   string strA,
   string strB,
   bool ignoreCase
);

第二个重载提供了一个名为 ignoreCase 的 Boolean 参数。该参数表示较简单的重载是对于字母大小写敏感的并且你只需要在忽略字母包装的时候才使用更复杂的重载。并且通常的默认值应该是 false。

避免在重载中使用任意变化的参数名称。如果重载中的一个参数呈现了与在另外一个重载中的参数一样的相同输出,那么这个参数就应该拥有相同的名称。

例如,不要做下列事情:

public void Write(string message, FileStream stream){}
public void Write(string line, FileStream file, bool closeStream){}

关于这些重载的正确定义如下所示:

public void Write(string message, FileStream stream){}
public void Write(string message, FileStream stream, bool closeStream){}
在被重载的成员中保持一致的参数次序。并且所有重载中名称相同的参数都应该出现在相同的位置。

例如,不要做下列事情:

public void Write(string message, FileStream stream){}
public void Write(FileStream stream,  string message, bool closeStream){}

关于这些重载的正确定义如下所示:

public void Write(string message, FileStream stream){}
public void Write(string message, FileStream stream, bool closeStream){}

这个指导方针有两个条件的约束:

  • 如果一个重载获取一个变量的列表,那么这个列表就必须是最后的一个参数。
  • 如果重载获取了输出参数,那么通过约定,那么这个输出参数就应该作为最后的参数出现。
如果可扩展性是必需的,那么就只在最长的重载签名中使用 virtual(在 Visual Basic 中是 Overridable)关键字。较短的重载应该简单地对一个较长的重载进行调用。

下列代码范例示范了这个实践。

public void Write(string message, FileStream stream)
{
    this.Write(message, stream, false);
}
public virtual void Write(string message, FileStream stream, bool closeStream)
{
    // 在这里运作。
}
不要使用 ref 或 out 修饰符来重载成员。

例如,不要做下列事情。

public void Write(string message, int count)
...
public void Write(string message, out int count)

通常,如果在你的设计中出现这种情况,就很有可能成为一个更加深奥的设计问题。考虑是否应该把这些成员的其中一个进行改名来提供更多关于准确动作的信息并由该方法所采用。

允许为可选的参量传递 null(在 Visual Basic 中是 Nothing)值。如果一个方法获取了可选的引用类型参量,允许传递 null 值来表示这个默认值应该被使用。这可以避免在调用成员之前对 null 值进行检查的问题。

例如,在下列范例中,开发者不应该对 null 值进行检查。

public void CopyFile (FileInfo source, DirectoryInfo destination, string newName)
{
    if (newName == null)
    {
        InternalCopyFile(source, destination);
    }
    else
    {
        InternalCopyFile(source, destination, newName);
    }
}
使用成员的重载胜于以默认参量来定义成员。因为默认参量并没有与 CLS 兼容并且也不能够在一些编程语言中被使用。

下列代码范例示范了错误的方法设计。

这个代码应该被重新设计成两个较简单重载来提供默认值。下列代码范例示范了正确的设计。

posted on 2007-01-29 21:42  Laeb  阅读(396)  评论(0编辑  收藏  举报