5

我目前的代码是

object[] method()
{
returning new object[] {"",12,} like this ?
}

元组是一个更好的选择吗?

我在这里得到了一些关于元组性能的信息

请建议一个好的选择移动..

这个类经常使用,请求也会很频繁。

更新

该返回值在不同的方法中是不同的。我将所有方法的返回值从 2 到 10 作为最大值。

逻辑正在将 sp [MS SQL 存储过程] 逻辑转换为 mongoDb 等效(所有数据都存在)

因此,对于 sp 来说,有一种方法应该以 sp 返回的形式返回。在 sp 中,使用了 OUT 参数,它也返回一些整数值。

在替换那个我使用

object[] method(out int returnValue)
 {
 }

returnValue 用于错误代码,object[] 作为 sp 输出参数的返回类型。

最好的方法是什么?

4

7 回答 7

12

您还有第三个选项:一个简单的类型化结果类或具有属性的结构。如果您返回的项目不超过 3 个,则元组是可以的。

在 C# 中返回对象数组是一种不好的做法 - 尝试尽可能地输入类型。作为一般的经验法则,您正在为您的开发人员创建代码(以便他/她可以轻松地使用/修改它)而不是计算机。让优化由框架进行。

于 2013-10-25T07:07:31.240 回答
4

我只会创建一个新的class并返回它的实例。由于正确的属性名称而不是 , ,这为您提供了类型安全性和Item1可读性Item2

而不是数组返回IEnumerable<>- 这样您就可以更改方法的实现(例如通过引入yield return)而不会破坏消费者。

记住这一点

过早优化是万恶之源

于 2013-10-25T07:08:02.237 回答
4

对于任何可能对两者之间的性能差异感兴趣的 Tuple<string,string>

class MyClass 
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

我用DotNetPearls的修改测试对其进行了测量,结果是:

项目数 = 1 000 000

8.27 ns -- 分配元组
7.28 ns -- 分配对象

2.46 ns -- 将元组作为参数
传递 2.28 ns -- 将对象作为参数传递

2.16 ns -- 返回元组
2.31 ns -- 返回对象

3.12 ns -- 从列表中加载元组
3.12 ns -- 从列表中加载对象

因此,至少Tuple在这种情况下使用没有性能理由

于 2013-10-25T08:03:38.463 回答
1

如果性能至关重要并且您只需要返回多个值,您还应该查看out参数:

string method(out int secondResult)
{
  secondResult = 12;
  return "";
}

可以说没有那么好,但您不必创建可能与性能相关的容器对象。

于 2013-10-25T07:06:32.377 回答
1

有很多方法可以做到这一点,返回元组就是其中之一。IDictionary 是另一个,但非常相似。

如果您想返回多个对象并仍然拥有控制权,另一种方法是在方法中使用 out 参数指定这些对象 这是一个小示例:

public bool method(out object result, out int intResult){
        result = new object[]{};
        intResult = 42;
        return true;
    }

在我看来,最好的方法是使用容器类,它可以在您的代码中清楚地看到返回的内容和数据代表的内容。

于 2013-10-25T07:07:24.323 回答
0

您有多种选择,具体取决于您的具体用例:

您可以创建一个新类(或结构)以仅返回一个对象。

你可以使用类似的东西

object object2 = new object();
object methodObject = method(out object2);
public object method(out object2){
    object2 = ...;
    object returnObject = new object(...); // do whatever you need
    return object;
}

有关更多信息,out请参见此处ref工作类似,请参见此处

您已经提到Tuple过,这也是一个选项。就个人而言,我会远离object[]返回类型。它只会让你的代码更难理解和维护。

于 2013-10-25T07:06:23.240 回答
0

元组更好,因为方法调用者会知道接收到的数据大小和类型:

// is better
var result = method().Value2 + 123;
// then
var received = method();
var result = 0;
if(received != null && received.Length > 1 && received[1] is int) // not sure, maybe received[1].GetType() == typeof(int)
    result = (int)received[1] + 123;

然而,最好的方法是为返回值提供一个自定义类:

class ReturnValue
{
    public string Text;
    public int Value;
    public ReturnValue(string text, int value)
    {
        Text = text;
        Value = value;
    }
}

ReturnValue method()
{
    // ...
    return new ReturnValue("", 12);
}
于 2013-10-25T07:13:31.283 回答