【问题标题】:Return KeyValuePair or use out variable in C#?在 C# 中返回 KeyValuePair 或使用 out 变量?
【发布时间】:2009-10-08 20:45:32
【问题描述】:

我有一个需要返回两个字符串的函数。我考虑了两种不同的方法来做到这一点:

string first = "this is first";
string second = "this is second";
KeyValuePair<string, string> ReturnPair()
{
    return new KeyValuePair<string, string>(first, second);
}
string ReturnOne(out string other)
{
    other = second;
    return first;
}

我想使用 KeyValuePair 方法,但我觉得我误用了创建此对象的目的。

我的问题:

  1. 在本例中是否有更好的方法来返回 2 个字符串?
  2. 返回 KeyValuePair 有什么问题吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    虽然返回KeyValuePair 没有技术上的错误,但您返回的东西在概念上不是“键值”对。这是一对简单的。

    您也可以使用Tuple,它在.NET 4.0 中可用,或者同时声明your own structure。

    我通常建议不要使用out 参数来返回元组。特别是当您使用 LINQ 和函数式语言结构时,使用 out 参数非常乏味。

    【讨论】:

    • 正确,我返回的不是 KeyValuePair,这就是为什么我在使用该构造时犹豫不决。事情是一个元组。感谢您的想法。
    【解决方案2】:

    如果数据在逻辑上属于一起,但在逻辑上不是另一个的键,我会定义一个封装它的新类型。

    如果一个是另一个的关键,我会使用 NameValuePair。

    【讨论】:

    • 我也想说这个。例如,如果您要表示一个人的两个姓名,则可以有一个具有 FirstName 和 LastName 属性的类。这为将来创建 FullName getter 提供了可能性。
    【解决方案3】:

    这将是我的首选方法。 KeyValuePair 是如此冗长。

    String[] ReturnPair()
    {
        return new [] { first, second };
    }
    

    【讨论】:

      【解决方案4】:

      我的个人意见是

      void ReturnTwo(out string one, out string two)
      {
        // do assignments
      }
      

      我觉得这样可以更明确地说明返回值是什么。

      【讨论】:

        【解决方案5】:

        我不喜欢多输出参数。如果第一个字符串不是真正的键,我也不喜欢使用键值对。我的建议是返回 List。这将提供一个灵活和稳定的签名。例如,如果您稍后决定要返回 3 或 4 个字符串,您可以只更新方法内部的逻辑,而无需使用签名。

        【讨论】:

          【解决方案6】:

          有一个类似的问题有多种答案:How do you return two values from a single method?

          从“干净代码”的角度来看,使用“out”参数返回这两个字符串是不好的。假设您没有时间重构/清理您的设计,John Kraft 提出的解决方案绝对可以接受。

          【讨论】:

            猜你喜欢
            • 2012-10-10
            • 2018-03-13
            • 2012-11-29
            • 1970-01-01
            • 2017-09-02
            • 2011-02-18
            • 1970-01-01
            • 1970-01-01
            • 2013-03-15
            相关资源
            最近更新 更多