【问题标题】:A general short guideline for passing method parameters by ref or by value ( C#)?通过 ref 或按值 (C#) 传递方法参数的一般简短指南?
【发布时间】:2010-10-28 04:06:57
【问题描述】:

类似:

  • 如果必须返回方法调用后的变量值:
  • if 可以在方法调用之前实例化使用 ref
  • if 调用前不需要实例化

  • 如果变量的值用于返回、决定或计算方法调用中的其他值,则不要使用 ref 和 out

我理解正确吗?您的简短指南是什么?

【问题讨论】:

    标签: c# parameters methods parameter-passing


    【解决方案1】:

    对于值类型:

    • 如果您只想使用包含的值而不是在原始位置更改它,请使用默认传递方法(按值)
    • 如果您需要在原始存储中更改它,请使用 ref.示例:

      int a = -3;
      
      protected void EnsurePositiveValues(ref int value)
      {
          if (value < 0)
              value = 0;
      }
      

    对于引用类型:

    • 如果您只需要使用实例或更改它,请使用默认传递方法(通过引用;应称为“通过引用复制”)
    • 如果您需要(重新)分配原始参考,请使用 ref.示例:

      User u = MembershipAPI.GetUser(312354);
      
      protected void EnsureUser(ref User user)
      {
          if (user == null)
              user = new User();
      }
      

    【讨论】:

      【解决方案2】:

      您还需要考虑值和引用类型。将引用类型作为参数传递给方法时,您将 指针 传递给变量。这意味着您可以在方法内部对变量进行更改,并且它们将可用于调用该方法的代码,但是如果您将其设置为 null,您只是将指针设置为 null,并且当您使用方法返回。

      【讨论】:

        【解决方案3】:

        不确定这是否真的回答了您的问题,但我发现通过 ref 传递值(使用 out 关键字)的一种很好的用法是......

        int i = 0;
        
        if (int.TryParse("StringRepresentation", out i)
        {
            // do something with i which has taken the value of a the previous successful TryParse
        }
        

        【讨论】:

          猜你喜欢
          • 2020-06-08
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 2020-02-12
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多