【问题标题】:C# Why can partial methods use ref, but not out?C#为什么partial方法可以使用ref,但不能out?
【发布时间】:2010-08-10 20:36:02
【问题描述】:

非常直接。 MSDN 声明您可以使用 ref,但不能使用部分方法。我只是好奇为什么?我的理解是,编译代码时,部分会被合并,那么限制是怎么回事? partial 不仅仅是让代码文件更干净、更有条理(即 eyecandy)吗?

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

【问题讨论】:

    标签: c# partial-methods


    【解决方案1】:

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

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

    所以对于使用 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(...);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 并且未初始化的值类型在 c# 编译器中是不合法的。很好的解释
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              正如其他人所说,必须分配out 参数。添加这个会产生编译器错误CS0177ref,另一方面必须在调用之前分配。

              【讨论】:

                猜你喜欢
                • 2010-11-03
                • 1970-01-01
                • 2011-02-25
                • 2011-05-13
                • 2014-01-11
                • 1970-01-01
                • 1970-01-01
                • 2013-03-21
                • 2018-02-06
                相关资源
                最近更新 更多