编辑:我知道这通常没有完成,并且是不好的做法,但我的手在这个特定的使用案例中被迫。我的另一种选择(正如我在这种情况下看到的那样)是通过我的单身人士(未示出)路由事件并订阅它 - 但这似乎也是'糟糕的形式'。
我有一个关于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如果这是一件坏事要问或不好,那么答案就是“是”:/
答案 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
的使用有点奇怪,因为当没有错误时success
是false
。