在c#中使用out关键字

时间:2011-10-10 17:47:58

标签: c# .net keyword out

任何人都可以建议我确切使用out关键字作为参数,以及它如何连接从函数返回多个值,就像在这个POST中一样,我与变量与正常变量混淆。任何人都可以帮助我。

8 个答案:

答案 0 :(得分:11)

这经常令人困惑,我认为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两个不同的名称,它们引用相同的变量。增量q也会增加x,因为它们是相同的。上一个示例中的zx两个不同的名称,它们引用了两个不同的变量。增量z不会更改x

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

现在清楚了吗?

更新:我没有说“out”和“ref”之间的区别是什么。区别很简单。在“调用方”一侧,“方法被调用之前的明确赋值变量。 “出局”不一定是。在“被调用方”一侧,可以在写入之前读取“ref”,但必须在读取之前写入“out”。此外,必须在控制正常离开方法之前写入“out”。

答案 1 :(得分:3)

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

  

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
    }
}

答案 2 :(得分:2)

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

int result;
if(Int32.TryParse("123", out result))
{
   Console.WriteLine(result + 1);
}

答案 3 :(得分:1)

您希望在以下情况下使用

out关键字: a)允许您的函数从调用代码堆栈AND修改特定变量 b)强制在函数中设置此变量值

答案 4 :(得分:1)

MSDN始终是一个开始的好地方

答案 5 :(得分:0)

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

如果您想要返回预定义类型的多个值(例如outintList<string>),那么

DateTime关键字就很好不想为此目的创建一个新类。

答案 6 :(得分: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;
}

注: 或者您可以考虑使用Tuple<bool,MyOutputType>,实际上F#将上面的模式解释为单独产生这样的元组。

答案 7 :(得分:0)

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

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

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

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

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

val =只读

ref =读/写

out =只写。