【问题标题】:How to tell if an out parameter was set already?如何判断是否已经设置了 out 参数?
【发布时间】:2012-05-09 03:08:56
【问题描述】:

有没有办法知道是否已经设置了 out 参数。这是我正在寻找的伪代码:

public virtual string blabla(long num, out bool bval)
    {
        if (!bval.HasValue)
            {
            //Do some default logic
            bval = defaultValue;
            }

        return blabla2(num, bval);
    }

【问题讨论】:

  • 如果你希望方法中会有一些东西,而不仅仅是出去,那么使用'ref'而不是'out'。
  • 看起来你需要一个可以为空的类型:ref bool? bval

标签: c# out


【解决方案1】:

你不能——你不能读取这个变量,直到它在你的方法中被明确地赋值。您应该将其视为一个局部变量,在方法开始时声明但未分配任何值 - 但您必须在返回之前为其分配一个值。 (如果抛出异常,可以不给它赋值。)

如果您想要一个将信息作为输入 传递到方法以及向外传播信息的参数,您应该使用ref 而不是out

更多信息请参见my article on parameter passing

【讨论】:

  • out 参数更适合我的情况。但我只是在检查是否有某种方法可以检查是否已分配值。还是谢谢。
  • @Omtara:“如果已分配值”究竟是什么意思?你的意思是在方法之外,还是在你自己的方法之内?如果您的意思是在您自己的方法中,您可以自己使用单独的 bool 局部变量来跟踪它。不过,在大多数地方,不知道你在代码中的位置是很奇怪的。
  • @Omtara - 当您在评论中说调用当前方法的外部方法使用相同的输出参数时,输出参数如何更合适?
  • @Joanna:我最终稍微更改了逻辑以使其与 out 参数一起使用。但是,正如 @ henk-holterman 所建议的那样,一个 ref Nullable 是了解它是否已设置的好方法。
【解决方案2】:

除了Jon's 很好的答案,如果您希望参数仍然是out,但需要查看它是否已在方法内部的某个位置分配了值,您可以使用本地可空类型,如如下:

public virtual string blabla(long num, out bool bval)
{
    bool? bvalLocal;

    ... //I'm assuming there is some code here that may or 
        //may not assign bvalLocal?

    // This whole if block may not be needed if the default
    // value is the default for the type (i.e. false) as
    // GetValueOrDefualt() will take care of that (see 
    // second to last line).
    if (!bvalLocal.HasValue)
    {
        //Do some default logic
        bvalLocal = defaultValue;
    }

    bval = bvalLocal.GetValueOrDefault();
    return blabla2(num, bval);
}

【讨论】:

  • 需要检查out参数的方法是从另一个使用相同out参数的方法调用的。所以使用局部可为空的变量是行不通的。
  • @Omtara - 如果您发布这些方法调用的代码(或伪代码)可能会有所帮助
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
相关资源
最近更新 更多