元组或对象数组最好从C#中的多个值的方法返回?

时间:2013-10-25 06:58:05

标签: c# .net

我目前的代码是

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

Tuple是一个更好的选择吗?

我获得了有关元组性能here

的一些信息

请建议移动的好选择..

此课程经常使用,请求频繁。

更新

不同方法的返回值不同。 我有所有方法返回的值从2到10为最大值

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

因此对于sp,一个方法应该以sp返回的形式返回。在sp中,使用OUT参数并且它也返回一些整数值。

代替我
object[] method(out int returnValue)
 {
 }

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

最好的方法是什么?

7 个答案:

答案 0 :(得分:10)

您还有第3个选项:简单类型的结果类或具有属性的结构。如果您返回不超过3件物品,则元组没问题。

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

答案 1 :(得分:4)

我只想创建一个新的class并返回它的实例。 由于使用了适当的属性名称而不是Item1Item2,这为您提供了类型安全性和可读性。

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

请记住

  

premature optimisation is the root of all evil

答案 2 :(得分:4)

对于可能对性能如何不同感兴趣的人 Tuple<string,string>

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

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

ItemsCount = 1 000 000

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

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

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

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

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

答案 3 :(得分:1)

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

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

可以说不是很好,但你不必创建一个可能与性能相关的容器对象。

答案 4 :(得分:1)

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

另一种方法是,如果要返回多个对象并仍然具有控制权,请使用方法中的out参数指定这些对象 这是一个小样本:

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

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

答案 5 :(得分: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的详细信息,请参阅hereref的工作方式类似,请参阅here

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

答案 6 :(得分: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);
}