具有多个返回参数的 C# 方法[重复]

Posted

技术标签:

【中文标题】具有多个返回参数的 C# 方法[重复]【英文标题】:C# methods with multiple return parameters [duplicate] 【发布时间】:2011-07-30 12:11:45 【问题描述】:

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);

【问题讨论】:

为什么需要将 firstName 和 lastName 作为单独的值返回?他们不应该在 Person 实例中表示吗? FirstName 和 LastName 是 Person 对象的属性。 【参考方案1】:

您可以使用 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# 特定的语法支持来声明元组和返回它们的函数)。

鉴于这里存在多种方法:System.Tuple、多个out 参数或返回具有FirstNameLastName 属性的POCO,我怀疑Anders Hejlsberg 可能不会添加对多次返回的显式支持价值观。

【讨论】:

@James 我相信您可以使用 Tuple.Create(p.FirstName, p.LastName) 来避免必须指定泛型参数。 是的,刚刚更新以反映这一点;-) @James:元组的唯一问题是获取组件的讨厌的.Item1.Item2 属性。使代码的可读性稍差。 ... 特别是因为它们从 1 开始计数,而不是像数组 f.e. 那样从 0 开始计数 System.Tuple 还具有与 F# 原生元组类型互操作的好处(嗯,它是 F# 的原生元组类型,恰好有 F# 特定的语法支持来声明元组和返回它们的函数.【参考方案2】:

不,只使用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;

【讨论】:

你的函数签名看起来很可疑 我看不出其他答案的原因,这个答案似乎很明显、简单、直接。 @user492238:是的,在那里复制和粘贴有点忘乎所以。 :-)【参考方案3】:

按照@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;
    

【讨论】:

我喜欢这个解决方案。它简单易懂。明显的缺点是没有静态类型检查。 @Jonathan Parker 如果您要退货的东西很少,那么您不必太担心。【参考方案4】:

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

public MyPersonClassGetFirstNameAndLastName(int id)

    var person = from p in People
                 where p.Id = id
                 select p;

    MyPersonClas-s-returnValue = new MyPersonClass;
    returnValue.FirstName = p.FirstName; 
    returnValue.LastName= p.LastName;
    return returnValue;

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

视情况而定。在您的情况下,您可以返回整个人的记录,

public string, string GetFirstNameAndLastName(int id)

    var person = from p in People
             where p.Id = id
             select p;
    return person;

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

【讨论】:

【参考方案7】:

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

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);

【讨论】:

谁对此做了-1?我不是 out 参数的忠实拥护者,但我想听听反对者的意见。

以上是关于具有多个返回参数的 C# 方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于多个参数精确匹配的 C# 字符串方法 [重复]

返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

C# ASP Page检查参数并返回其他页面[重复]

从c#中的方法返回多个值[重复]

C#中常见的系统内置委托用法详解(抄录)

Asp.net(C#) 获取 执行sql server 语句/存储过程后的 多个返回值?