返回代码或输出参数?

Nob*_*ody 18 c# pass-by-reference

我正在制作一个从服务器获取文件名列表的方法,但我遇到了一个我无法回答的问题.

该方法返回两件事:

  • 一个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是an SftpResult和an 的复合对象ArrayList)

这是首选,为什么?

Jon*_*eet 32

我个人更喜欢最后一个选项(虽然使用List<T>ReadOnlyCollection<T>代替ArrayList).out参数基本上是一种返回多个值的方法,封装它们通常更好.

.NET 4中的另一个选择是

Tuple<SftpResult, ArrayList> GetFileList(string directory)
Run Code Online (Sandbox Code Playgroud)

这明确地说,"这个方法返回两件事......我已经为这个特殊情况将它们打包在一起,但是不值得进一步封装它们:它们不值得在一个单独的类型中进行编写".

(如果您不使用.NET 4,您可以随时编写自己的Tuple类型.)


Fre*_*örk 9

我宁愿把它包装在一个返回对象中:

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; }
}
Run Code Online (Sandbox Code Playgroud)

不使用会感觉更清洁out.

  • 我认为这是最后一个选择......虽然我个人认为它是不可改变的. (3认同)