我目前的代码是
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参数的返回类型。
最好的方法是什么?
答案 0 :(得分:10)
您还有第3个选项:简单类型的结果类或具有属性的结构。如果您返回不超过3件物品,则元组没问题。
在C#中返回一个对象数组是一种不好的做法 - 尝试尽可能地键入。作为一般的经验法则,您正在为您的开发人员创建代码(以便他/她可以轻松地使用/修改它)而不是计算机。让框架进行优化。
答案 1 :(得分:4)
我只想创建一个新的class
并返回它的实例。
由于使用了适当的属性名称而不是Item1
,Item2
,这为您提供了类型安全性和可读性。
而不是数组返回IEnumerable<>
- 这样你可以改变方法的实现(例如通过引入yield return
)而不会破坏消费者。
请记住
答案 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
的详细信息,请参阅here。 ref
的工作方式类似,请参阅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);
}