[英]Tuple or Object array is best to return from a method for multiple values in C#?
我目前的代码是
object[] method()
{
returning new object[] {"",12,} like this ?
}
Tuple是一个更好的选择吗?
请建议一个很好的选择..
该课程经常使用,请求频繁。
UPDATE
返回值在不同方法中有所不同。 我有所有方法返回的值从2到10为最大值。
逻辑是我将sp [MS SQL存储过程]逻辑转换为等效的mongoDb(所有数据都存在)
因此对于sp,一个方法应该以sp返回的形式返回。在sp中,使用OUT参数并且它也返回一些整数值。
在替换即时通讯中使用
object[] method(out int returnValue)
{
}
returnValue用于错误代码,object []用作sp的out参数的返回类型。
什么是最好的方法呢?
您还有第3个选项:简单类型的结果类或具有属性的结构。 如果您返回的不超过3件物品,则元组没问题。
在C#中返回一个对象数组是一种不好的做法 - 尝试尽可能地键入。 作为一般的经验法则,您正在为您的开发人员创建代码(以便他/她可以轻松地使用/修改它)而不是计算机。 让框架进行优化。
我只是创建一个新class
并返回它的实例。 由于适当的属性名称而不是Item1
, Item2
,这为您提供了类型安全性和可读性。
而不是数组返回IEnumerable<>
- 这样你可以改变方法的实现(例如通过引入yield return
)而不破坏消费者。
记得那个
对于那些可能对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
没有性能原因
如果性能是至关重要的,你只需要返回多于一个值,你也应该考虑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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.