【问题标题】:When should out and ref parameters be used in C#?什么时候应该在 C# 中使用 out 和 ref 参数?
【发布时间】:2011-03-21 22:18:40
【问题描述】:

我有一个关于约定的非常简单的问题,C# 中的方法何时应该有 ref 或 out 参数?

这如何适应良好的 OOP 而不仅仅是懒惰或糟糕的设计?

作为一个例子,我遇到了 MembershipProvider 类(来自 .NET System.Web.Security),它有一个 CreateUser 方法,该方法有一个用于 MembershipCreateStatus 的输出并返回一个 MembershipUser。

这背后的原因主要是因为当有案例需要从方法中获取信息但不合适/不能从方法中返回?

谢谢

【问题讨论】:

标签: c# asp.net oop coding-style


【解决方案1】:

想想下面的系统:

你有一个方法,它返回一个对象和某种状态(甚至更多实例)。现在您有 2 个返回值选项:

  1. 创建一个封装器,封装bool(或enum)状态和实际结果
  2. 分离这 n 个实例

如果我必须返回超过 2 个实例,我更喜欢包装器。如果签名只处理状态和结果,我更喜欢out/ref-style。

对于out/ref-style 我更喜欢例如签名。 TryParsebool TryParse(out T result),因为这在使用它时提供了一种更自然的方式,例如。为:

int foo;
if (int.TryParse(someString, out foo)) {
   // do something with foo
}

MyState state;
Foo fooInstance = FooCreator.Create(out state);
if (fooInstance != null)
* OR *
if (state == State.Success)

可能不是那么自然

【讨论】:

    【解决方案2】:

    out 参数的主要用途是当您需要返回多个事物时。

    TryParse,一个在大量数字对象上的静态方法,例如需要在成功时返回真/假以及转换的值。

    如果您需要返回多个值,有些人可能更喜欢返回具有多个属性的对象/结构;它只是偏好。

    【讨论】:

      【解决方案3】:

      根据C#documentation for out

      out 关键字使参数成为 通过引用传递。这是相似的 到 ref 关键字,除了 ref 要求变量是 在通过之前初始化。

      因此,当您需要将值传递给方法并从方法接收值时,请使用ref 参数。当信息流仅从方法流向调用者时,使用out 参数。为了完成这个故事,有一个简单的 value 参数将信息传递给方法,但不能从方法接收信息。

      我并不认同 outref 仅在您需要从一个方法返回多个项目时使用的想法。我总是更喜欢使用 out 从具有副作用的方法返回值。

      对我来说,这就是您问题的答案。如果方法没有副作用,并且方法的名称是与返回值含义匹配的名词,则通过函数返回值从函数返回单个值。否则通过outref 参数返回值。

      【讨论】:

        猜你喜欢
        • 2010-11-13
        • 1970-01-01
        • 2010-11-10
        • 2013-02-16
        • 2020-02-11
        • 2010-12-30
        • 2010-10-18
        相关资源
        最近更新 更多