在C#中正确使用out参数

时间:2014-07-18 12:33:42

标签: c# out

编辑:我知道这通常没有完成,并且是不好的做法,但我的手在这个特定的使用案例中被迫。我的另一种选择(正如我在这种情况下看到的那样)是通过我的单身人士(未示出)路由事件并订阅它 - 但这似乎也是'糟糕的形式'。

我有一个关于out参数的问题,然后我把它扔进我的代码并弄乱了。

class myExam
{
    private bool faulted = true;

    public myExam(string demo) { .... }

    public myExam(string one, string two, string three) { .... }

    public myExam(string demo, out bool success)
    {
        try
        {
            // bool to hard kill processing
            while(faulted)
            {

                // do stuff

                // no fault, out true
                success = faulted;

                // break loop
                faulted = false;

            }

        }
        catch
        {
            // fault, set faulted, return out false
            faulted = false;
            success = faulted;
            // Correct? ^
        }
    }
}

我的问题是这个。 A)是在catch中返回的正确方法,而B)在try中,如果没有问题,那么输出是真的吗?我的假设是我已经正确地阅读/理解了所有内容,但是再一次,在弄乱之前我想知道我是否可以检查一下我的逻辑。 idk如果这是一件坏事要问或不好,那么答案就是“是”:/

3 个答案:

答案 0 :(得分:4)

略有不同的建议,但为什么不在你的对象上有一个LoadSuccess属性,例如

public class MyExam {
   public bool LoadSuccess { get; private set; }

   public MyExam() {
      //If not loadeded happily set the LoadSuccess property in here.
   }
}

这使得您的代码比构造函数中的out参数略微意外。


上面将以你的结构化方式解决代码,但对我来说,如果出现错误,那么应该在调用代码中抛出并处理异常。

假设另一位开发人员在线下调用此代码,但在构造函数调用后不评估'success'布尔值。那么会发生什么 - 代码会继续愉快吗?可能不是。

答案 1 :(得分:2)

让我们接受你的问题,这样我们就可以结束这个了。

A)是在捕获中返回的正确方法

正如我在评论中所说,获取out参数的正确方法是"返回"一个值是分配给它。所以,是的,为catch中的success参数赋值(而不是进一步更改它)将使构造函数"返回"该参数中的该值。

B)在try中,没有问题,输出会是真的吗?

是的,前提是您确保在其他地方设置success,或许是为了开始。否则,编译器会认为您无法在所有情况下设置参数并抱怨。

(显示的代码)


如果您不能或不会改变代码以删除注释中建议的out参数,并且循环只是为了使成功成为现实,我会简化代码:

public myExam(string demo, out bool success)
{
    success = false;
    try
    {
        // do stuff

        // no fault, out true
        success = true;
    }
    catch
    {
    }
}

但是,我可能还会确保处理您知道可能发生的异常。这样一个catch-everything块在很多层面都是错误的 不是一个好推荐。

答案 2 :(得分:2)

必须在方法返回之前分配Out参数,以便所有可能的路径都必须设置success的值。您可能希望添加finally子句并在其中设置值,或者您可以将其设置为默认值以开始,然后继续使用该方法的其余部分。

如果我将代码粘贴到linqpad中,实际上会出现编译错误:

The out parameter 'success' must be assigned to before control leaves the current method

另一方面,您对faulted的使用有点奇怪,因为当没有错误时successfalse