具有多个返回参数的C#方法

时间:2011-04-06 04:31:26

标签: c# .net language-design

c#/。net?

中是否需要多个返回参数
public string, string GetFirstNameAndLastName(int id)
{
    var person = from p in People
                 where p.Id = id
                 select p;
    return(p.FirstName, p.LastName);
}

用法:

public void Main(string[] args)
{
    string firstName, lastName;
    (firstName, lastName) = GetFirstNameAndLastName(1);

    Console.WriteLine(firstName + ", " + lastName);
}

7 个答案:

答案 0 :(得分:7)

您可以使用C#4.0中的Tuple以轻量级方式实现此目的

public Tuple<string, string> GetFirstNameAndLastName(int id)
{
   var person = from p in People
             where p.Id = id
             select p;
   return new Tuple<string, string>(p.FirstName, p.LastName);

   // OR
   // return Tuple.Create(p.FirstName, p.LastName);
}

System.Tuple还具有与F#本机元组类型互操作的好处(好吧,它是F#的本机元组类型,恰好是F#特定的语法支持,用于声明返回它们的元组和函数)。 / p>

鉴于此处存在多种方法:System.Tuple,多个out参数或返回具有FirstNameLastName属性的POCO,我怀疑Anders Hejlsberg可能不是将为多个返回值添加显式支持。

答案 1 :(得分:5)

不,只需使用out参数。

public void GetFirstNameAndLastName(int id, out string first, out string last)
{
    var person = from p in People
                 where p.Id = id
                 select p;
    first = p.FirstName;
    last = p.LastName;
}

答案 2 :(得分:4)

根据@James Webster的建议,您可以使用元组,也可以使用dynamicExpandoObject

class Program
{
    static void Main(string[] args)
    {
        var d = GetUserDynamic();
        Console.WriteLine("{0}.{1}", d.FirstName, d.LastName);
    }

    private static dynamic GetUserDynamic()
    {
        dynamic d = new ExpandoObject();
        d.FirstName = "amandeep";
        d.LastName = "tur";
        return d;
    }
}

答案 3 :(得分:1)

没有。如果元素相关,则应返回更有用的数据类型,如类。

public MyPersonClassGetFirstNameAndLastName(int id)
{
    var person = from p in People
                 where p.Id = id
                 select p;

    MyPersonClassreturnValue = new MyPersonClass;
    returnValue.FirstName = p.FirstName; 
    returnValue.LastName= p.LastName;
    return returnValue;
}

答案 4 :(得分:0)

除了其他答案中指出的可能性之外,还有更多方法可以实现这一目标:

  1. 创建自己的返回类型(类似于Tuple方法)并返回它的实例
  2. ref参数:http://msdn.microsoft.com/en-us/library/14akc2c7%28v=vs.80%29.aspx

答案 5 :(得分:0)

取决于具体情况。在您的情况下,您可以返回整个人的记录,

public string, string GetFirstNameAndLastName(int id)
{
    var person = from p in People
             where p.Id = id
             select p;
    return person;
}

或者如果情况需要,您可以创建自己的数据类型。

答案 6 :(得分:-1)

你可以这样做你想做的事:

public void GetFirstNameAndLastName(int id, out string firstName, out string lastName)
{
    var person = from p in People
                 where p.Id = id
                 select p;
    firstName = p.FirstName;
    lastName =  p.LastName;
}

然后像这样调用它:

public void Main(string[] args)
{
    string firstName, lastName;
    GetFirstNameAndLastName(1, out firstName, out lastName);

    Console.WriteLine(firstName + ", " + lastName);
}