我读了这个问题的c++版本,但并没有真正理解它。
有人能解释清楚,如果它可以在c#中完成,以及如何?
我读了这个问题的c++版本,但并没有真正理解它。
有人能解释清楚,如果它可以在c#中完成,以及如何?
当前回答
你不能在c#中这样做。你能做的就是有一个out形参或者返回你自己的类(或者结构,如果你想让它是不可变的)。
Using out parameterpublic int GetDay(DateTime date, out string name)
{
// ...
}
Using custom class (or struct)
public DayOfWeek GetDay(DateTime date)
{
// ...
}
public class DayOfWeek
{
public int Day { get; set; }
public string Name { get; set; }
}
其他回答
之前的帖子是对的。c#方法不能返回多个值。然而,你确实有几个选择:
返回一个包含多个成员的结构 返回类的实例 使用输出参数(使用out或ref关键字) 使用字典或键值对作为输出
这里的利与弊通常很难弄清楚。如果您返回一个结构,请确保它很小,因为结构是值类型并传递给堆栈。如果你返回一个类的实例,这里有一些设计模式,你可能想要使用,以避免引起问题-类的成员可以修改,因为c#通过引用传递对象(你不像在VB中那样有ByVal)。
最后,您可以使用输出参数,但我将限制在只有两个(如3个或更少)参数的情况下使用此方法-否则事情将变得丑陋且难以维护。此外,输出参数的使用可能会抑制灵活性,因为每次需要向返回值中添加内容时都必须更改方法签名,而返回结构或类实例时无需修改方法签名即可添加成员。
从架构的角度来看,我建议不要使用键值对或字典。我发现这种编码风格需要使用方法的代码中的“秘密知识”。它必须提前知道键将是什么,值的含义是什么,如果开发人员在内部实现中改变了字典或KVP的创建方式,那么很容易在整个应用程序中创建故障级联。
从这篇文章中,你可以使用上面提到的三个选项。
KeyValuePair是最快的方法。
Out是在秒。
Tuple是最慢的。
不管怎样,这取决于什么对你的情况是最好的。
方法:
1) KeyValuePair(最佳性能- 0.32 ns):
KeyValuePair<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{
return new KeyValuePair<int,int>(p_2 - p_1, p_4-p_3);
}
2)元组- 5.40 ns:
Tuple<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{
return new Tuple<int, int>(p_2 - p_1, p_4-p_3);
}
3) out (1.64 ns) or ref 4)创建自己的自定义类/结构
Ns ->纳秒
参考:多个返回值。
在c# 7及以上版本中,可以看到这个答案。
在以前的版本中,你可以使用。net 4.0+的元组:
例如:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
有两个值的元组有Item1和Item2作为属性。
在面向对象的方式中使用一个这样的类:
class div
{
public int remainder;
public int quotient(int dividend, int divisor)
{
remainder = ...;
return ...;
}
}
函数成员返回大多数调用者主要感兴趣的商。此外,它将余数存储为数据成员,之后调用者可以很容易地访问它。
通过这种方式,您可以有许多额外的“返回值”,这在实现数据库或网络调用时非常有用,在这些调用中可能需要大量的错误消息,但仅在发生错误时才需要。
我也在OP提到的c++问题中输入了这个解决方案。