代码之家  ›  专栏  ›  技术社区  ›  Nobody

返回码还是输出参数?

  •  18
  • Nobody  · 技术社区  · 15 年前

    该方法返回两个结果:

    • SftpResult
    • 文件名列表。

    public static ArrayList GetFileList(string directory, out SftpResult result)

    public static SftpResult GetFileList(string directory, out ArrayList fileNames)

    public static SftpFileListResult GetFileList(string directory)

    (其中 SftpFileListResult 和一个 ArrayList

    首选哪种?为什么?

    7 回复  |  直到 11 年前
        1
  •  32
  •   Jon Skeet    15 年前

    就我个人而言,我更喜欢最后一个选项(尽管使用 List<T> ReadOnlyCollection<T> 而不是 ArrayList ). out 参数基本上是一种返回多个值的方法,而且 通常地 最好把它们封装起来。

    NET4中的另一个选项是

    Tuple<SftpResult, ArrayList> GetFileList(string directory)
    

    它明确地说,“这个方法返回两件事。。。我已经为您打包了这个特殊的案例,但不值得进一步封装它们:它们不值得用单独的类型来编写”。

    (如果您不使用.NET4,您可以自己编写 Tuple 类型。)

        2
  •  9
  •   Fredrik Mörk    15 年前

    我更愿意将其包装在一个return对象中:

    class FileResult
    {
        public FileResult(SftpResult resultCode, IEnumerable<string> files)
        {
             ResultCode = resultCode;
             FileList = new List<string>(files);
        }
        public SftpResult ResultCode { get; private set; }
        public IEnumerable<string> FileList { get; private set; }
    }
    

    out .

        3
  •  4
  •   Mark Byers    15 年前

    我更喜欢最后的选择。Out参数很少使用,有些人可能会感到惊讶/困惑。创建复合结果对象是一个干净的解决方案。唯一的缺点是必须为此目的创建一个类。

        4
  •  3
  •   Woot4Moo    15 年前

    我要说第三个,因为它将您需要的逻辑封装在一个位置。我只能假设SftpResult和ArrayList返回方法应该是私有的,然后构成复合返回对象的内部逻辑。

        5
  •  2
  •   Marcus Johansson    15 年前

    我会做到:

    public static bool GetFileList(string directory, out SftpResult result, out ArrayList fileNames)
    

    因此,对于函数的作用没有任何混淆,如果GetFileList失败,我也会返回bool。

        6
  •  2
  •   Eric Lippert    15 年前

    如果你喜欢一个函数做两件事的设计,那么我会使用元组lajon或者返回对象lafredrik。

    如果你想对它保持乐观,你可以让类型系统来完成这项工作:

    abstract class FtpResult { ... }
    sealed class FileList : FtpResult { ... }
    sealed class Error : FtpResult { ... }
    ...
    sealed class FtpService
    {
        ...
        public FtpResult GetFileList(string directory) { ... }
        ...
    }
    ...
    var result = service.GetFileList(dir);
    var error = result as Error;
    var list = result as FileList;
    if (error != null) { ... }
    else if (list != null)
    {
        foreach(var name in list.Files) { ... }
    }
    ... 
    
        7
  •  1
  •   Puppy    15 年前

    为什么不提供这三个呢?我不喜欢在我的函数调用中使用out参数,但我可以理解在很多时候它们是需要的。如果您不知道要支持哪个签名,那么请支持所有三个签名。最终,选择权在打电话者一边,你能做的最好的事情就是提供这个选择。

    推荐文章