【问题标题】:How ref & out works across methods with local variables?ref & out 如何跨具有局部变量的方法工作?
【发布时间】:2015-05-11 17:24:39
【问题描述】:

我们不能为方法中的字段指定访问修饰符,我怀疑这样做的原因是方法内的字段(即局部变量)应该仅在该特定方法内具有范围,因此无需指定访问修饰符.

class Program
    {
        public static void Main()
        {
            int Y;
            Test(out Y);
        }

        private static void Test(out int X)
        {
            X = 17;
        }
    }

问题:

如果方法字段的范围在该方法内,那么refout 如何跨方法工作?我知道它们是passed by reference,但是当 CLR 的范围仅限于特定方法时,它如何传递该变量地址(引用)?

【问题讨论】:

  • 因为它没有意义。局部变量只能在其声明的范围内访问。
  • @Selman22 - 很好,这就是我在第一行中所写的内容(但可能反对者没有阅读整个问题)。但是如何跨方法访问refout
  • @RahulSingh 它们是通过引用传递的,与其他参数不同。编译器通过引用,你可以认为它是变量的地址。这就是您访问内存中原始值的方式。顺便说一句,您可能应该用您的实际问题更改标题。
  • @Selman22 - 已更新。请澄清我的疑问。

标签: c# methods access-modifiers


【解决方案1】:

这些是 local variables,只能在方法的代码块 (methodName{..code-block-here..}) 范围内访问,您不能为它们指定任何其他可访问性级别 - 无法从外部世界访问它们。

【讨论】:

    【解决方案2】:

    尝试在方法中声明private 变量是没有意义的。因为默认情况下您不能访问方法之外的变量。在方法中声明的变量称为局部变量。所以允许给它一个访问修饰符是没有任何意义的

    【讨论】:

      【解决方案3】:

      修饰符用于控制外部类对变量的访问。

      例如,您可能不希望除您自己以外的任何类访问变量,或者您只希望同一个包中的子类和类访问它。这就是修饰符的工作。

      然而,方法变量不能被该方法之外的任何东西访问,并且不会比方法完成所花费的时间更长,因此在方法内部使用修饰符确实没有意义。变量访问是固定的,因为它的范围非常有限。

      【讨论】:

        【解决方案4】:

        如果方法字段的范围在该方法内,那么 ref 和 out 如何跨方法工作?我知道它们是通过引用传递的,但是当 CLR 的范围仅限于该特定方法时,CLR 如何传递该变量地址(引用)?

        变量地址不受其作用域的约束。有了地址后,您可以从任何地方访问该地址中的对象。每当您在refout 参数中进行更改时,都会使用此地址.编译器使用它来访问和操作实际数据。因此范围与它无关。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多