为什么使用 ref 关键字时没有出现错误?

3

根据定义,必须在传递之前初始化ref关键字,而out参数必须在从函数返回之前进行初始化。

以下是我的代码片段。

   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()时,我没有初始化name参数。但据我理解,在传递之前必须初始化ref参数。 它可以编译和运行而不会出现错误。

6
通过对TestOut的调用,name已被初始化。 - Lee
1
尝试在执行TestOut(out name)之前执行TestRef(ref name) - 您将会得到一个编译器错误。 - Zohar Peled
@Lee。你说得对。我明白了。愚蠢的错误。谢谢 - Kgn-web
@ZoharPeled。是的。谢谢。 - Kgn-web
3个回答

7

TestOut 保证当方法执行结束时 name 变量将被初始化。

参见 out 关键字

虽然作为 out 参数传递的变量在传递之前不必进行初始化,但所调用的方法需要在返回之前分配一个值。

以及 ref

传递给 ref 参数的参数必须在传递之前进行初始化。这与 out 参数不同,后者的参数在传递之前不必显式初始化。有关详细信息,请参阅 out。

重新排列方法调用,您将看到您所期望的行为。


很高兴看到你添加了解释。这会有所帮助 :) - Kgn-web

1

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


0

将该行注释掉 TestOut(out name);//fineTestOut(out name);//fine 以下几行代码会报错 string name; TestRef(ref name) // 为什么不报错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接