C# 什么';输出参数有什么问题?

C# 什么';输出参数有什么问题?,c#,sql,vba,vb6,C#,Sql,Vba,Vb6,在SQL和C#中,我从未真正喜欢过输出参数。我也从未在VB6中传递参数ByRef。一些关于依靠副作用来完成某件事的事情让我很烦恼 我知道它们是解决无法从一个函数返回多个结果的一种方法,但SQL中的行集或C#和VB中的复杂数据类型也可以工作,并且对我来说似乎更自我记录 我的想法是否有问题,或者是否有权威来源的资源支持我?你个人对此有什么看法?为什么?对于那些希望使用输出参数进行设计的同事,我能说些什么呢?这些参数可能会说服他们使用不同的结构 编辑:有趣的转折点-我问这个问题的输出参数被用来代替返回

在SQL和C#中,我从未真正喜欢过输出参数。我也从未在VB6中传递参数ByRef。一些关于依靠副作用来完成某件事的事情让我很烦恼

我知道它们是解决无法从一个函数返回多个结果的一种方法,但SQL中的行集或C#和VB中的复杂数据类型也可以工作,并且对我来说似乎更自我记录

我的想法是否有问题,或者是否有权威来源的资源支持我?你个人对此有什么看法?为什么?对于那些希望使用输出参数进行设计的同事,我能说些什么呢?这些参数可能会说服他们使用不同的结构


编辑:有趣的转折点-我问这个问题的输出参数被用来代替返回值。当返回值为“ERROR”时,调用方应将其作为异常处理。我当时是这么做的,但对这个想法并不满意。一位同事没有被告知需要处理这种情况,因此,由于程序无声地失败,损失了大量金钱

输出参数可能是一种代码气味,表明您的方法做得太多。如果需要返回多个值,则该方法可能会执行多个操作。如果数据紧密相关,那么它可能会从一个同时包含两个值的类中受益

当然,情况并非总是如此,但我发现情况通常都是这样


换句话说,我认为你避免使用它们是正确的。

我通常从不使用它们,我认为它们令人困惑,太容易滥用。我们偶尔会使用ref参数,但这与传入结构和返回结构有更多关系。

我觉得你的观点很合理

输出参数的另一个缺点是将结果从一个函数传递到另一个函数所需的额外代码。您必须声明变量,调用函数以获取其值,然后将值传递给另一个函数。不能只嵌套函数调用。这使得代码的读取非常必要,而不是声明性的。

写了这段干净的代码。输出参数打破了函数的基本概念


output=someMethod(input)

我认为它们对于在同一个SQL命令中获取新插入行的ID很有用,但我不认为我在其他方面使用过它们。

C++0x正在获取元组,一种类似于匿名结构的东西,其成员可以通过索引访问。C++程序员将能够将多个值打包成一个并返回它。C#有类似的东西吗?它可以返回数组吗?但输出参数有点笨拙和不清楚

他们有自己的位置。Int32.TryParse方法是有效使用out参数的一个很好的例子

bool result = Int32.TryParse(value, out number);
if (result)
{
    Console.WriteLine("Converted '{0}' to {1}.", value, number);         
}

我也很少看到out/ref参数的使用,尽管在SQL中,通过参数传回值有时比通过resultset(这将需要使用DataReader等)更容易

不过,幸运的是,我只是在C#today中创建了一个如此罕见的函数。它验证了一个类似于表的数据结构,并返回了其中的行数和列数(这很难计算,因为该表可能具有类似于HTML的rowspans/colspan)。在这种情况下,同时计算两个值。将其分为两个函数将导致代码、内存和CPU时间需求翻倍。仅为这一个函数返回而创建一个自定义类型对我来说也太过分了

因此-有时它们是最好的,但大多数情况下,没有它们您也可以做得很好。

SQL Server 2005以后版本中的子句是为受DML语句影响的行获取任何字段值的一个重要步骤。我认为在很多情况下,这会消除输出参数

在VB6中,ByRef参数用于传递ADO对象

除了我想到的这两种特殊情况,我倾向于避免使用它们。

仅在SQL中

存储过程输出参数很有用

  • 假设您需要返回一个值。您是否“创建#表,插入…exec,选择@var=”。还是使用输出参数

  • 对于客户端调用,输出参数比处理记录集快得多

  • 使用返回值仅限于有符号整数

  • 易于重复使用(如安全检查帮助程序)

  • 同时使用时:记录集=数据,输出参数=状态/消息/行数等

  • 存储过程记录集输出不能像UDF或客户端代码那样为强类型

  • 您不能总是使用UDF(例如上面的安全检查期间的日志记录)

  • 但是,只要输入和输出通常不使用相同的参数,那么直到SQL完全更改,您的选项都是有限的。这么说,我有一个例子,我使用一个参数作为输入和输出值,但我有一个很好的理由。

    我的两分钱:
    我同意输出参数是一种令人担忧的做法。VBA通常由编程新手维护,如果维护代码的人没有注意到某个参数是ByRef,他们可能会引入一些严重的逻辑错误。此外,它也会打破属性/功能/子范式。
    使用out参数是不好的做法的另一个原因是,如果确实需要返回多个值,则很可能在数据结构(如类或用户定义类型)中包含这些值。
    然而,它们可以解决一些问题。VB5(以及Office 97的VBA)不允许函数返回数组。这意味着任何返回或更改数组的操作都必须通过“out”参数来完成。在VB6中,添加了此功能,但VB6仍然强制数组参数按引用(以防止过多)