C#,输出多个值的方法

时间:2012-06-21 18:21:51

标签: c#

我正在使用c#。

我有一个输出多个值的方法。我知道 out ,但这是一种引用类型。 是否有任何等价值类型,但也可以从方法输出多个值。使用引用类型,值也会在方法之外更改,因此我想阻止。

    out

4 个答案:

答案 0 :(得分:8)

  

我知道 out ,但这是一种参考类型。

目前尚不清楚你的意思。 out根本不是一个类型 - 它是参数的装饰器。您可以将它与引用类型或值类型一起使用:

// Nasty, but it does work...
void SplitInTwo(string input, out string x1, out string x2, 
                out int actualSplitCount)
{
    string[] bits = input.Split('/');
    x1 = bits[0];
    x2 = bits[1];
    actualSplitCount = bits.Length;
}

所以你可以以任何一种方式使用out。但是,我强烈建议你这样做。您可以将Tuple类型系列用于临时多个值,但如果返回的值实际上是相关的,则应考虑将它们封装到单独的类型中,并返回该类型的值。

答案 1 :(得分:1)

我建议创建一个描述您的返回值的类,并为您需要返回的每个值提供属性。

如果你不需要经常传递结果,那么元组是一个不错的选择,但总的来说它很难维护。我更喜欢使用有意义的属性名称而不是Tuple提供的Item1,Item2,Item3等。 out参数也有效,但它们需要以不同的方式编写调用代码以适应方法实现,我建议尽可能避免使用。

答案 2 :(得分:0)

out关键字(和ref关键字)用于表示从调用者的范围提供变量。它们不会改变相关类型的性质。

out parameter modifier (C# Reference) @ MSDN

如果您担心每次使用方法时都要求调用者强制指定out,您可以使用Helper类或Tuple来包装返回的值集。

Tuple Class @ MSDN

您提到您担心要更改的引用类型。这不应该是您的方法的问题。 out指定的参数不会被您的方法使用的所有情况共享,它们是调用方法的范围的本地。只有来电者才需要担心,而且只能在他们自己的范围内。

最后,如果您想表明某个变量可能被更改或使用而不需要按out}的要求为其分配值,请使用ref

答案 3 :(得分:0)

有些事情:

class MultiValue
{
    type A {
        get { return m_A; }
        set { m_A = value; }
    }

    type B{
        get { return m_B; }
        set { m_B = value; }
    }

    private type m_A;
    private type m_B;
}

可以根据您要执行的操作而工作(在单个实例中返回值,或者如果您需要在一段时间/方法中维护这些值)。

Tuple类型也可以达到类似的效果,效果更好,具体取决于您希望在程序中执行的操作。