很直接。MSDN 声明您可以使用 ref,但不能使用部分方法。我只是好奇为什么?我的理解是在编译代码时,部分会被合并,那么限制是怎么回事?partial
除了使代码文件更整洁、更有条理(即eyecandy)之外,还有更多的东西吗?
7 回答
您必须考虑如果未实现部分方法会发生什么。
然后发生的事情是所有对该方法的调用都被删除,就好像它们从未发生过一样。
所以对于使用 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
必须分配参数。添加这将生成编译器错误CS0177 ref
另一方面必须在进行调用之前分配。