什么时候应该在C#中使用out和ref参数?

时间:2011-03-21 13:45:03

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

关于约定我有一个非常简单的问题,什么时候方法实际上应该在C#中引用参数?

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

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

背后的原因基本上是因为当需要从方法中获取信息但是它不合适/不能从方法返回时?

由于

3 个答案:

答案 0 :(得分:2)

想到以下系统:

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

  1. 创建一个包装器,它封装了bool(或enum)状态和实际结果
  2. 将这些n个实例分开
  3. 我更喜欢包装器,如果我必须返回2个以上的实例。如果签名只处理状态和结果,我更喜欢out / ref - 样式。

    对于out / ref - 样式我更喜欢签名例如。 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)
    

    可能不是那么自然

答案 1 :(得分:1)

out参数的主要用途是当你需要返回多个东西时。

TryParse,一个对大量数字对象的静态方法,例如,当成功时需要返回true / false,还需要返回值。

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

答案 2 :(得分:1)

根据C#documentation for out

  

out关键字会导致参数   通过引用传递。这是类似的   到ref关键字,除了ref   要求变量是   在被传递之前初始化。

因此,当您需要将值传递给方法时,请使用ref参数,以及从方法接收值。当信息流仅从方法发送给调用者时,请使用out参数。为了完成这个故事,有一个unadorned值参数,它将信息传递给方法,但不能从方法中接收信息。

我真的不认为只有在需要从方法中返回多个项目时才使用outref。我总是喜欢使用out来返回有副作用的方法中的值。

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