3

谁能建议我确切地使用 out 关键字作为参数,以及它如何连接以从函数返回多个值,就像在这个POST中一样,我对 out 变量和普通变量感到困惑。任何人都可以帮助我。

4

8 回答 8

12

这经常令人困惑,我认为 MSDN 文档实际上有点“只有在已知的情况下才清楚”。也就是说,它是正确的,但只有你已经理解了这个概念,它才真正有意义。

这就是我的想法。

常规参数会复制参数。当你说:

static int M(int z) { z = z + 1; return z; }    
...
int x = 123;
int y = M(x);

就像你说的那样:

int x = 123;
int z = x; // make a copy of x
z = z + 1;
int y = z;

ref 或 out 参数为现有变量创建别名。当你说

static void N(ref int q) { q = q + 1; }    
...
int x = 123;
N(x);

这和说的一样:

int x = 123;
// MAGIC: q is now an another name for variable x
q = q + 1;

qx是指同一个变量的两个不同名称。递增也递增,因为它们是相同的。并且在前面的示例中是两个不同的名称,它们引用了两个不同的变量。递增不变。qxzxzx

总结:“out”和“ref”只是表示“不要创建新变量;而是暂时为现有变量创建第二个名称”。

现在清楚了吗?

更新:我没有说“out”和“ref”之间的区别是什么。区别很简单。在“调用者”方面,“ref”必须是在调用方法之前明确分配的变量。不需要“出局”。在“被调用者”端,“ref”可能在写入之前被读取,但“out”必须在读取之前写入。此外,必须在控制正常离开方法之前写入“out”。

于 2011-10-10T18:04:10.847 回答
4

MSDN 文档已经很好地解释了这一点:

out 关键字导致参数通过引用传递。这类似于 ref 关键字,不同之处在于 ref 要求变量在传递之前进行初始化。要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}
于 2011-10-10T17:50:41.347 回答
2

它经常用于“尝试”获取值的模式中,例如:

int result;
if(Int32.TryParse("123", out result))
{
   Console.WriteLine(result + 1);
}
于 2011-10-10T17:51:14.820 回答
1

out当您想要:a)允许您的函数从调用代码堆栈修改特定变量并且 b)强制在您的函数中设置此变量值时,应使用关键字

于 2011-10-10T17:50:42.347 回答
1

MSDN总是一个很好的起点

于 2011-10-10T17:51:40.520 回答
1

在包含的大多数语言中,您可以通过两种方式传递值,按值,按引用。

按值为方法提供数据的副本,因此更改数据不会对原始数据产生任何影响

通过引用本质上为该方法提供了数据的内存地址,因此如果该方法修改了数据,它会更改原始数据。

Out 是 ref 的一种特殊类型,因为在调用方法之前不需要初始化变量,可以通过传入 null 来调用它。它必须由方法设置。

您可以想到的另一种方式(从外部代码的角度来看)是:

val = 只读

ref = 读/写

out = 只写。

于 2011-10-10T17:57:46.420 回答
0

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

out如果您想返回多个预定义类型的值(例如 an int、 aList<string>和 a DateTime),并且您不想为此目的创建一个新类,则关键字很好。

于 2011-10-10T17:49:52.657 回答
0

行,

让我们看看这种函数的常用模式 - TrySomething. 假设您有一个函数可能会成功地给您一个值,但您不会为此使用异常,因为您不想要开销或者这是一个常见的特征。然后,true如果方法成功,您通常会返回,否则返回false。但是你会把你的输出值放在哪里呢?

一个可能的答案是使用这样的out参数:

bool TrySomething(MyInputType input, out MyOutputType output)
{
   output = default(MyOutputType);
   /* ... Try getting the answer ... */
   if (!successful)
      return false;

   output = successfulOutput;
   return true;
}

备注:或者您可能会考虑使用 aTuple<bool,MyOutputType>并且确实 F# 将上述模式解释为自身产生这样的元组。

于 2011-10-10T17:55:13.857 回答