我正在使用c#。
我有一个输出多个值的方法。我知道 out ,但这是一种引用类型。 是否有任何等价值类型,但也可以从方法输出多个值。使用引用类型,值也会在方法之外更改,因此我想阻止。
out
答案 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
来包装返回的值集。
您提到您担心要更改的引用类型。这不应该是您的方法的问题。 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
类型也可以达到类似的效果,效果更好,具体取决于您希望在程序中执行的操作。