【发布时间】:2010-08-10 20:36:02
【问题描述】:
非常直接。 MSDN 声明您可以使用 ref,但不能使用部分方法。我只是好奇为什么?我的理解是,编译代码时,部分会被合并,那么限制是怎么回事? partial 不仅仅是让代码文件更干净、更有条理(即 eyecandy)吗?
参考:MSDN Article - “部分方法可以有 ref 但不能有 out 参数。”
【问题讨论】:
标签: c# partial-methods
非常直接。 MSDN 声明您可以使用 ref,但不能使用部分方法。我只是好奇为什么?我的理解是,编译代码时,部分会被合并,那么限制是怎么回事? partial 不仅仅是让代码文件更干净、更有条理(即 eyecandy)吗?
参考:MSDN Article - “部分方法可以有 ref 但不能有 out 参数。”
【问题讨论】:
标签: c# partial-methods
你必须考虑如果部分方法没有实现会发生什么。
然后发生的事情是所有对该方法的调用都被删除,就好像它们从未发生过一样。
所以对于使用 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(...);
【讨论】:
因为与 ref 参数不同,out 参数必须在方法返回之前初始化。如果部分方法没有实现(这是一个有效的场景)如何初始化它?
【讨论】:
我的猜测是因为out 参数不需要初始化,而ref 参数需要。
如果在部分方法上使用out 参数,C# 如何验证该参数是否已初始化?
【讨论】:
out 参数表明您希望从方法中获取一个值。如果该方法不存在,则无法提供该值。
替代方法是将变量的值显式设置为其默认值(0、null 等),而不是执行方法调用。这样,变量仍然会被肯定地初始化——尽管默认值可能不是一个非常有用的值。我相信 C# 团队已经考虑过这一点——它甚至可能会成为未来的版本,谁知道呢?我个人怀疑它是否会特别有用,但可能性是存在的。
目前,您始终可以改用ref 参数,只需在调用默认值之前手动初始化变量即可。
【讨论】:
我认为原因是只有签名(即没有实现)的部分方法仍然有效。如果你有一个 out 参数,那么实现少的方法总是会导致错误(因为没有分配 out 值)
【讨论】:
一个部分方法被拆分为部分类。需要一种方法来为 OUT 参数赋值。部分方法可以实现也可以不实现。这意味着多个代码块正在尝试为 OUT 参数赋值。
【讨论】:
正如其他人所说,必须分配out 参数。添加这个会产生编译器错误CS0177ref,另一方面必须在调用之前分配。
【讨论】: