2017-01-23 50 views
3

根据定义,ref关键字必须在传递之前进行初始化。而out参数必须在从函数返回之前进行初始化。为什么我没有得到与ref关键字错误

下面是我的代码片段。

public void TestRef(ref string n) 
    { 

    } 

    public void TestOut(out string n) 
    { 

     n = "Hello"; //if I don't initialize, I gets compile time error. & That's right. 

    } 

现在调用方法。

string name; 
TestOut(out name);//fine 
TestRef(ref name) // why not throwing error. 

在上面的电话时,试图调用TestRef()我没有初始化的名称参数。但根据我的理解参数必须在传递之前进行初始化。

它建立&运行没有任何错误。

+6

'name'已通过调用'TestOut'进行初始化。 – Lee

+1

尝试在TestOut(out name)之前执行'TestRef(ref name)' - 你会得到一个编译器错误。 –

+0

@李。你是对的。我明白了。愚蠢的错误。谢谢 –

回答

6

TestOut保证name变量将被初始化时方法完成执行

out关键字

虽然为out参数传递的变量没有被 传递初始化之前,被调用的方法要求 在方法返回前分配一个值

ref

传递给ref参数的参数在传递之前必须初始化为 。这与out参数不同,其参数 在传递之前不必显式初始化。有关 的更多信息,请参阅。

重新排序方法调用,你会看到你期望的行为。

+0

很高兴看到您添加了解释。我会帮你的 :) –

1

调用TestOut方法首先保证name变量的初始化。 重新排序方法调用,你会看到你期望的行为。

0

注释掉 TESTOUT(满分名); // fineTestOut(满分名); //细 你会得到错误以下行 字符串名称; TestRef(ref name)//为什么不抛出错误。

相关问题