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

本文关键字:返回 方法 对象 数组 元组 | 更新日期: 2023-09-27 18:36:46

我当前的代码是

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

元组是更好的选择吗?

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

请建议一个不错的选择。

此类经常使用,请求将频繁。

更新

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

逻辑

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

因此,对于 sp,有一种方法应该作为 sp 返回返回。在 sp 中使用该 OUT 参数,它还返回一些整数值。

在替换它时,我正在使用

object[] method(out int returnValue)
 {
 }

返回值用于错误代码,对象 [] 作为 sp out 参数的返回类型。

最好的方法是什么?

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

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

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

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

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

请记住

过早优化是万恶之源

对于可能对性能差异感兴趣的任何人 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的性能原因

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

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

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

有很多

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

如果要返回多个对象但仍具有控制权,另一种方法是在方法中使用 out 参数指定这些对象下面是一个小示例:

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

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

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

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

你可以使用类似的东西

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[]返回类型。它只会使您的代码更难理解和维护。

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

// 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);
}