元组或对象数组最好从 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 参数的返回类型。
最好的方法是什么?
您还有第三个选项:简单的类型化结果类或具有属性的结构。如果您返回的物品不超过 3 个,元组是可以的。
在 C# 中返回对象数组是一种不好的做法 - 尽量类型化。作为一般的经验法则,您正在为您的开发人员同事创建代码(以便他/她可以轻松使用/修改它)而不是计算机。让框架进行优化。
我只会创建一个新class
并返回它的实例。这为您提供了类型安全性和可读性,这要归功于正确的属性名称而不是Item1
、Item2
。
而不是数组返回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);
}