19

很直接。MSDN 声明您可以使用 ref,但不能使用部分方法。我只是好奇为什么?我的理解是在编译代码时,部分会被合并,那么限制是怎么回事?partial除了使代码文件更整洁、更有条理(即eyecandy)之外,还有更多的东西吗?

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

4

7 回答 7

21

您必须考虑如果未实现部分方法会发生什么。

然后发生的事情是所有对该方法的调用都被删除,就好像它们从未发生过一样。

所以对于使用 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(...);
于 2010-08-10T20:40:33.810 回答
9

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

于 2010-08-10T20:39:00.003 回答
4

我的猜测是因为out参数不需要初始化,而ref参数需要。

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

于 2010-08-10T20:39:39.557 回答
4

一个out参数表明您希望从方法中获取一个值。如果该方法不存在,则无法提供该值。

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

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

于 2010-08-10T20:39:58.783 回答
1

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

于 2010-08-10T20:41:06.190 回答
1

部分方法被拆分为部分类。需要一种方法来为 OUT 参数赋值。部分方法可以实现也可以不实现。这意味着多个代码块正在尝试为 OUT 参数赋值。

于 2010-08-10T20:41:22.107 回答
1

正如其他人所说,out必须分配参数。添加这将生成编译器错误CS0177 ref另一方面必须在进行调用之前分配。

于 2010-08-10T20:55:03.350 回答