【问题标题】:Best practice: ref parameter or return value?最佳实践:参考参数还是返回值?
【发布时间】:2011-11-21 09:08:48
【问题描述】:

其实我是在做一个列表作为参考参数如下:

public static List ListMethod(List result)

我也看到有人这样做:

public static void ListMethod(ref List result)

如果我没记错的话,“my”方法也将list作为参考参数,您应该可以像“other”在他的方法中那样使用它。

但是在我看来,你输入一个参数,用它做一些事情并在方法返回值中返回它似乎更“干净”。

有什么好的论据支持或反对一种方法吗?

【问题讨论】:

  • 这是一个列表?为什么要通过 ref 发送它你想要达到什么目的?
  • 如果 out 作为 ref/out 传递,内部会在堆栈中生成一个指向堆副本的引用,并将其传递给被调用方方法。如果使用 ref,则使用相同的引用作为传递参数。
  • 为什么您认为您需要在第一种方法中返回 List 而在第二种方法中不返回任何内容?
  • 当然,如果列表本身只是被变异了,那么就不需要返回或引用。但是,如果您为参数分配一个全新的列表,那么被调用者需要返回或引用才能看到更改。但是,如下所述,即使最终结果看起来相同,return 和 ref 之间也存在差异。
  • 这个简单的例子应该让你明白pastebin.com/sm8niPRD和jon skeet所说的一样。

标签: c# parameters return-value


【解决方案1】:

很可能您不需要使用ref - 但区别。

通常当我看到人们使用ref 作为引用类型参数时,这是因为他们不了解参数传递的工作原理。但是如果你的方法有这样的东西:

result = new List();
...

那么在第一种情况下调用者不会看到更改,而在第二种情况下调用者的变量将被更改为引用新对象。

请查看我的article on parameter passing 了解更多详情。

【讨论】:

    【解决方案2】:

    不,您的方法不使用ref 参数。默认为pass by value

    不同之处在于,您的方法只能修改列表的内容,但不能修改参数result 指向的引用。

    最好的方法是什么?这取决于你的方法应该做什么。

    当您的方法修改列表或返回新数据时,您应该使用返回值。 理解代码的作用比使用 ref 参数要好得多。

    返回值的另一个好处是能够使用方法链接。

    您可以编写这样的代码,将列表参数从一种方法传递到另一种方法:

    ListMethod1(list).ListMethod2(list)...
    

    【讨论】:

    • +1 表示能够进行方法链接。如果您真的想这样做,您甚至可以这样做修改参数; return result; 在 LOC、CPU 或复杂性方面都不是很昂贵,并且可以让函数使用者的生活变得更轻松。
    【解决方案3】:

    如果您只是返回一个列表,则应始终使用第一个,因为它表明了这种意图。

    带有ref 的版本告诉我,我可以从一个列表开始,你的方法会修改我发送的列表,甚至用另一个列表进行更改。如果这是你的意图,那就去做吧。

    但如果方法总是返回一个新列表,请使用返回值而不是 ref 参数。

    附注:您可以使用 out 而不是 ref 来表明您返回新列表的意图,但这仅在您使用其他东西的返回值。

    【讨论】:

      【解决方案4】:

      这里的 ref 参数的一个特别之处是 - “一个通过 ref 传递的变量必须首先被赋值。”。因此,如果您想严格要求调用方法在调用之前分配值,您可能可以使用 ref 参数。

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        相关资源
        最近更新 更多