C#为什么部分方法可以使用ref,但不能出来?

时间:2010-08-10 20:36:02

标签: c# partial-methods

非常直接。 MSDN声明您可以使用ref,但不能使用部分方法。我只是好奇为什么?我的理解是,当编译代码时,部分被合并,那么限制是什么呢? partial还有更多的内容,而不仅仅是使代码文件更清晰,更有条理(即眼睛看上去)吗?

参考:MSDN Article - “部分方法可以有ref但不能有out个参数。”

7 个答案:

答案 0 :(得分:20)

你必须考虑如果没有实现部分方法会发生什么。

然后会发生的是,对方法的所有调用都被剥离,好像它们从未发生过一样。

因此对于使用out的方法,它看起来像这样:

stream s;
GetStream(out s);
s.Write(...);

并编译好像它说的那样:

stream s;
s.Write(...);

由于s尚未初始化,因此不允许使用此代码。保证在您尝试调用Write方法时初始化变量与调用GetStream绑定。

返回数据的方法也是如此。如果你没有实现部分方法,那么整个方法调用就不会被编译,你需要考虑你能做什么和不能做什么,并且仍然保留调用它的代码有效。就out和返回值而言,它有可能使调用代码无效或不完整,因此不允许这样做。

对于ref,这是有效的,因为初始化已由调用代码处理:

stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
    s.Write(...);

答案 1 :(得分:9)

因为与ref参数不同,必须在方法返回之前初始化out参数。如果未实现部分方法(这是一个有效的方案),如何初始化?

答案 2 :(得分:4)

我的猜测是因为out参数不需要初始化而ref参数可以。{/ p>

如果在部分方法上使用out参数,C#如何验证参数是否已初始化?

答案 3 :(得分:4)

out参数表明您需要一个方法之外的值。如果该方法不存在,则无法提供该值。

另一种方法是将变量的值显式设置为其默认值(0,null等),而不是执行方法调用。这样变量仍然会被初始化 - 尽管默认值可能不是非常有用的。我相信C#团队已经考虑过这一点 - 它甚至可能会成为未来的版本,谁知道呢?我个人怀疑它会特别有用,但可能存在。

目前,您总是可以使用ref参数,只需在调用默认值之前手动初始化变量。

答案 4 :(得分:1)

我认为原因是因为只有签名(即没有实现)的部分方法仍然有效。如果你有一个out参数,一个无实现的方法总会导致错误(因为没有任何指定out值)

答案 5 :(得分:1)

部分方法分割为部分类。需要一种方法为OUT参数赋值。部分方法可能会也可能不会实施。这意味着多个代码块正在尝试为OUT参数赋值。

答案 6 :(得分:1)

正如其他人所说,必须指定out参数。要添加此项,将生成编译器错误CS0177 ref,另一方面必须在拨打电话之前分配。