我正在使用 c#。
我有一个输出多个值的方法。我知道但这是一个参考类型。是否有任何等效于值类型但也可以从方法中输出多个值的东西。使用引用类型,值也会在方法之外更改,所以我想阻止。
out
我正在使用 c#。
我有一个输出多个值的方法。我知道但这是一个参考类型。是否有任何等效于值类型但也可以从方法中输出多个值的东西。使用引用类型,值也会在方法之外更改,所以我想阻止。
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
类型族用于特定的多个值,但如果返回的值实际上是相关的,则应考虑将它们封装到单独的类型中,并返回该类型的值。
我建议创建一个类来描述您的返回值,并为您需要返回的每个值提供属性。
如果您不需要经常传递结果,元组是一个不错的选择,但通常它更难维护。我更喜欢使用有意义的属性名称,而不是 Tuple 提供的 Item1、Item2、Item3 等。out 参数也可以工作,但它们需要以不同的方式编写调用代码以适应方法实现,我建议尽可能避免使用。
类似的东西:
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
类型也会实现类似的效果,同样,根据您想要在程序中执行的操作,结果会更好。
out
关键字(和ref
关键字)用于表示一个变量是从调用者的作用域提供的。它们不会改变相关类型的性质。
如果您担心要求调用者在out
每次使用您的方法时都被强制指定,您可以使用 Helper 类或 aTuple
来包装返回的值集。
您提到您担心引用类型被更改。这不应该是您的方法的问题。指定的参数out
并非在您的方法可能使用的所有情况下都共享,它们在调用您的方法的范围内是本地的。只有调用者需要担心,而且只在他们自己的范围内。
最后,如果您想指示可以更改或使用变量而不需要根据需要为其分配值out
,请使用ref
.