非常直接。 MSDN声明您可以使用ref,但不能使用部分方法。我只是好奇为什么?我的理解是,当编译代码时,部分被合并,那么限制是什么呢? partial
还有更多的内容,而不仅仅是使代码文件更清晰,更有条理(即眼睛看上去)吗?
参考:MSDN Article - “部分方法可以有ref但不能有out个参数。”
答案 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
,另一方面必须在拨打电话之前分配。