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

很直接。 MSDN声明您可以使用ref,但不能使用部分方法。 我只是好奇为什么 ? 我的理解是,当编译代码时,部分被合并,那么限制是什么呢? 有没有更多的partial而不仅仅是使代码文件更清洁和有组织(即eyecandy)?

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

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

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

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

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

并编译好像它说:

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

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

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

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

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

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

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

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

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

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

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

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

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

正如其他人所说out必须指定params。 要添加这个将产生编译器错误CS0177 ref另一方面必须在进行调用之前分配。