2

我正在使用 c#。

我有一个输出多个值的方法。我知道但这是一个参考类型是否有任何等效于值类型但也可以从方法中输出多个值的东西。使用引用类型,值也会在方法之外更改,所以我想阻止。

    out
4

4 回答 4

8

我知道但这是一个参考类型

不清楚你的意思。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类型族用于特定的多个值,但如果返回的值实际上是相关的,则应考虑将它们封装到单独的类型中,并返回该类型的值。

于 2012-06-21T18:23:42.057 回答
1

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

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

于 2012-06-21T18:31:14.277 回答
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类型也会实现类似的效果,同样,根据您想要在程序中执行的操作,结果会更好。

于 2012-06-21T18:31:26.017 回答
0

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

out 参数修饰符(C# 参考)@MSDN

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

元组类@MSDN

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

最后,如果您想指示可以更改或使用变量而不需要根据需要为其分配值out,请使用ref.

于 2012-06-21T18:23:00.163 回答