【问题标题】:Are "out" parameters a bad thing in .NET?.NET 中的“out”参数是一件坏事吗?
【发布时间】:2010-09-21 19:34:51
【问题描述】:

“out”参数在 .NET 中是不是一件坏事?关于这个主题有什么好的文章/讨论吗?

【问题讨论】:

标签: .net


【解决方案1】:

在大多数情况下,我建议不要使用 Out 参数。它们基本上会给您的代码添加副作用,并且在调试时可能是一场噩梦。

MSDN 上有一篇关于 Out 参数的文章:http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx

【讨论】:

    【解决方案2】:

    我认为它们在需要时非常有用。

    关于 ref 和 out 参数的 Msdn 文章。

    【讨论】:

      【解决方案3】:

      嗯,我有an article on what ref/out do - 但它没有讨论你是否应该使用它们。

      基本上out 参数通常表示您希望从一个方法有效地返回两个结果。这通常是一种代码异味——但在某些情况下(尤其是 TryXXX 模式),您出于充分的理由确实想要返回两条信息,而封装它们没有多大意义在一起。

      换句话说,在你可以轻松做到的地方避免使用 out/ref,但不要为了避免它们而大费周章。

      【讨论】:

        【解决方案4】:

        好问题。我的回答是我不是特别喜欢它们,但我确实在我的一个项目中使用它们,其中多个返回值很常见。我有一个财务数据库,它返回实际价格(或空/零)、主要错误代码和次要错误代码。该库有几十到几百个方法,每个错误代码都是不同的类型,因此为每个创建自定义类并返回一个实例将非常笨拙。

        【讨论】:

          【解决方案5】:

          【讨论】:

            【解决方案6】:

            当您需要返回多个对象作为函数的结果时,Out 参数很有用。在我看来,

            void doSomeThing(Thing toDoItTo,
                             out OtherThing result1,
                             out AnotherThing result2)
            {
                ...
            }
            
            OtherThing y;
            AnotherThing z;
            
            doSomeThing(x, out y, out z);
            
            y.method1();
            z.method2();
            

            干净很多
            struct DoSomeThingResults
            {
                public OtherThing Result1;
                public OtherThing Result2;
            }
            
            DoSomeThingResults doSomeThing(Thing toDoItTo)
            {
                ...
            }
            
            DoSomethingResults results = doSomeThing(x);
            
            results.Result1.method1();
            results.Result2.method2();
            

            另外,使用out参数意味着保证结果被赋值。

            【讨论】:

              【解决方案7】:

              在没有元组的情况下,它们有时是最干净的做事方式。不过,我通常讨厌他们。

              F# 有一些很好的语法糖来处理它们。它没有让我处理out 参数,而是将它们视为返回元组的方法。各种TryParse 方法最终返回两个元素元组:

              let success, value = Int32.TryParse("1234")
              (* success is true *)
              (* value is 1234 *)
              

              很方便,不会让我觉得脏。

              【讨论】:

              • 对于这种特殊情况,您可以很容易地使用 Nullable,并使用一个包装器方法,该方法为“解析失败”返回 null。它不像 F# 解决方案那样简洁,但如果您使用 C# 并且不想要 out 参数,则值得牢记。
              【解决方案8】:

              使用Out一点也不坏

              让我们尝试精确的好处:

               using ref force us to initialize it so we are letting the ref variable to place in heap and consume some spaces .
              
               in most cases we return null if the operation has some none logic conditions 
              
               but with Out we avoid consuming the heap and refspace
              

              【讨论】:

                猜你喜欢
                • 2012-05-28
                • 2011-02-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-15
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多