Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于C#中的多个值,最好从方法返回元组或对象数组?_C#_.net - Fatal编程技术网

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

对于C#中的多个值,最好从方法返回元组或对象数组?,c#,.net,C#,.net,我现在的代码是 object[] method() { returning new object[] {"",12,} like this ? } 元组是更好的选择吗 我得到了一些关于元组性能的信息 请建议一个好的搬家选择 这个类经常使用,请求也会频繁 更新 返回值在不同的方法中是不同的。 我让所有方法返回的最大值为2到10 逻辑正在将sp[MS SQL存储过程]逻辑转换为等效的mongoDb(所有数据都存在) 因此,对于sp,有一个方法应该以sp返回的形式返回。对于该方法,在sp中使用OUT

我现在的代码是

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的out参数的返回类型


实现这一点的最佳方法是什么?

根据具体的使用情况,您有多种选择:

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

你可以用像这样的东西

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
的更多信息,请参阅<代码>参考的工作原理类似,请参阅


您已经提到了
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;
    }

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

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


在C#中返回一个对象数组是一种糟糕的做法——尽量使用类型。一般来说,您是为您的开发伙伴(以便他/她可以轻松地使用/修改)而不是为计算机创建代码。让框架进行优化。

我只需创建一个新的
并返回它的实例即可。 由于使用了正确的属性名,而不是
Item1
Item2
,因此可以提供类型安全性和可读性

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

记住这一点


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

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

对于任何可能对以下各项的性能差异感兴趣的人
元组

class MyClass 
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}
我已经用修改后的测试对其进行了测量,结果如下:

ItemsCount=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
没有性能上的理由

如果使用OOP,那么在这种情况下创建一个带有必要字段的新类不是更好吗?这取决于实际情况,Tuple是好的,因为它提供了类型安全性,但是其中的项没有setter,因此一旦创建它们就无法修改(一旦在内存中创建,元组就不可变)但是如果你只返回两个东西,我会选择KeyValuePair,每次都会执行得更好。尝试在这里使用元组只是想偷懒,但这不利于可读、可维护的代码。7个月后,
.Item6
对读者意味着什么?是的:这。这样我就可以为e的返回值创建struct返回两个以上值的每个方法。这很好,但不要忘记
struct
的行为不同于
class