我读了这个问题的c++版本,但并没有真正理解它。
有人能解释清楚,如果它可以在c#中完成,以及如何?
我读了这个问题的c++版本,但并没有真正理解它。
有人能解释清楚,如果它可以在c#中完成,以及如何?
当前回答
主要有两种方法。 1. 使用out/ref参数 2. 返回一个对象数组
其他回答
你可以使用动态对象。我认为它比Tuple有更好的可读性。
static void Main(string[] args){
var obj = GetMultipleValues();
Console.WriteLine(obj.Id);
Console.WriteLine(obj.Name);
}
private static dynamic GetMultipleValues() {
dynamic temp = new System.Dynamic.ExpandoObject();
temp.Id = 123;
temp.Name = "Lorem Ipsum";
return temp;
}
不,在c#中(对于低于c# 7的版本),你不能从一个函数返回多个值,至少不能像在Python中那样。
然而,也有一些选择:
您可以返回一个object类型的数组,其中包含您想要的多个值。
private object[] DoSomething()
{
return new [] { 'value1', 'value2', 3 };
}
你可以使用out参数。
private string DoSomething(out string outparam1, out int outparam2)
{
outparam1 = 'value2';
outparam2 = 3;
return 'value1';
}
在c# 7中有一个新的元组语法:
static (string foo, int bar) GetTuple()
{
return ("hello", 5);
}
你可以返回一个记录:
var result = GetTuple();
var foo = result.foo
// foo == "hello"
你也可以使用新的解构器语法:
(string foo) = GetTuple();
// foo == "hello"
但是要小心序列化,所有这些都是语法糖——在实际编译的代码中,这将是一个Tuple<string, int>(根据接受的答案),包含Item1和Item2,而不是foo和bar。这意味着序列化(或反序列化)将使用这些属性名。
因此,对于序列化,声明一个记录类并返回它。
c# 7中的另一个新特性是改进了out形参的语法。你现在可以内联声明out,这在某些情况下更适合:
if(int.TryParse("123", out int result)) {
// Do something with result
}
但是,大多数情况下,您将在. net自己的库中使用它,而不是在您自己的函数中。
你可以试试这个
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
当你的方法是异步的,你想返回多个属性。你必须这样做:
public async Task<(int, int)> GetMultipleValues(){
return (1,2);
}