8

我只是想知道其他开发人员如何解决从方法中获得 2 或 3 个答案的问题。

1) 返回一个对象[]
2) 返回一个自定义类
3) 在多个变量上使用 out 或 ref 关键字
4) 编写或借用 (F#) 一个简单的 Tuple<> 泛型类
http://slideguitarist.blogspot.com/2008 /02/whats-f-tuple.html

我现在正在处理一些可以刷新数据的代码。从进行刷新的方法中,我想传回(1)刷新开始时间和(2)刷新结束时间。
以后我可能想传回第三个值。

想法?开源 .NET 项目在这个主题上有什么好的做法吗?

4

16 回答 16

28

这完全取决于结果是什么。如果它们彼此相关,我通常会创建一个自定义类。

如果它们不是真正相关的,我会使用 out 参数或拆分方法。如果一个方法想要返回三个不相关的项目,它可能做得太多了。例外情况是当您在 Web 服务边界或其他“更纯粹”的 API 可能过于冗长的情况下交谈时。

于 2008-12-03T17:15:17.263 回答
10

两个,通常是 4)

不仅如此,2)

于 2008-12-03T17:12:30.950 回答
5

您的问题指出您将来可能会返回更多数据,因此我建议您实现自己的类来包含数据。

这意味着即使您传递的对象的内部表示发生变化以容纳更多数据,您的方法签名也将保持不变。出于可读性和封装的原因,这也是一种很好的做法。

于 2008-12-03T17:37:29.403 回答
2

明智的代码架构当需要更改特定数量的变量时,我总是使用自定义类。为什么?仅仅因为类实际上是常用数据类型的“蓝图”,创建自己的数据类型(在这种情况下就是这样)将帮助您获得良好的结构并帮助其他人为您的接口编程。

于 2008-12-03T17:19:12.373 回答
2

就个人而言,我讨厌 out/ref 参数,所以我宁愿不使用这种方法。此外,大多数情况下,如果您需要返回多个结果,您可能做错了什么。

如果它真的是不可避免的,那么从长远来看,你可能会最开心地编写一个自定义类。返回一个数组很诱人,因为它在短期内既简单又有效,但是使用类可以让您选择在将来更改返回类型,而不必担心会导致下游问题。想象一下,如果有人交换返回的数组中两个元素的顺序,那么可能会发生调试噩梦......

于 2008-12-03T18:20:29.737 回答
1

如果它只有 1 个或 2 个附加变量,我会使用 out(例如,一个函数返回一个 bool,它是实际的重要结果,但也有一个 long 作为 out 参数,用于返回函数运行的时间,用于记录目的)。

对于更复杂的事情,我通常会创建一个自定义结构/类。

于 2008-12-03T17:13:32.837 回答
1

我认为 C# 程序员执行此操作的最常见方式是将要返回的项目包装在单独的类中。恕我直言,这将为您提供最大的灵活性。

于 2008-12-03T17:14:46.547 回答
1

这取决于。对于仅限内部的 API,我通常会选择最简单的选项。一般都是这样的。

对于公共 API,自定义类通常更有意义 - 但如果它是相当原始的东西,或者函数的自然结果是布尔值(如 *.TryParse),我将坚持使用 out 参数。您也可以使用隐式强制转换为 bool 来创建自定义类,但这通常很奇怪。

对于您的特定情况,一个简单的不可变 DateRange 类对我来说似乎最合适。您可以轻松添加新价值,而不会打扰现有用户。

于 2008-12-03T17:16:36.997 回答
1

如果您想发回刷新开始时间和结束时间,则建议使用可能的类或结构,可能称为 DataRefreshResults。如果您可能的第三个值也与刷新有关,则可以添加它。请记住,结构总是按值传递,因此在堆上分配它不需要进行垃圾收集。

于 2008-12-03T17:37:30.637 回答
1

有些人使用KeyValuePair两个值。但这并不是很好,因为它只是将这两个东西标记为KeyValue。不是很描述。此外,它还会从添加以下内容中受益匪浅:

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

使您不必在创建类型时指定类型。泛型方法可以推断类型,泛型类构造函数不能。

于 2008-12-03T20:05:07.437 回答
1

对于您的场景,您可能希望定义通用 Range{T} 类(检查范围有效性)。

如果方法是私有的,那么我通常使用我的助手库中的元组。公共或受保护的方法通常总是值得分开。

于 2008-12-20T12:18:34.947 回答
1

返回自定义类型,但不要使用类,使用结构 - 没有内存分配/垃圾收集开销意味着没有缺点。

于 2008-12-20T12:23:30.367 回答
0

如果是 2,则为一对。

如果超过2个班。

于 2008-12-03T17:28:12.323 回答
0

另一种解决方案是返回命名对象引用的字典。对我来说,这相当于使用自定义返回类,但没有混乱。(并且使用 RTTI 和反射,它与任何其他解决方案一样类型安全,尽管是动态的。)

于 2008-12-03T18:39:47.047 回答
0

这取决于结果的类型和含义,以及方法是否是私有的。

对于私有方法,我通常只使用我的类库中的元组。

对于公共/受保护/内部方法(即非私有),我使用 out 参数或自定义类。

例如,如果我正在实现 TryXYZ 模式,其中有一个在失败时抛出异常的 XYZ 方法和一个返回布尔值的 TryXYZ 方法,TryXYZ 将使用一个 out 参数。

如果结果是面向序列的(即返回应该处理的 3 个客户),那么我通常会返回某种集合。

除此之外,我通常只使用自定义类。

于 2008-12-20T12:30:46.217 回答
0

If a method outputs two to three related value, I would group them in a type. If the values are unrelated, the method is most likely doing way too much and I would refactor it into a number of simpler methods.

于 2008-12-20T12:39:05.967 回答