请考虑以下方法签名:
public static bool TryGetPolls(out List<Poll> polls, out string errorMessage)
Run Code Online (Sandbox Code Playgroud)
此方法执行以下操作:
这是好风格吗?
更新:让我说我确实使用以下方法签名:
public static List<Poll> GetPolls()
Run Code Online (Sandbox Code Playgroud)
并且在该方法中,它不会捕获任何异常(因此我依赖调用者来捕获异常).如何处置和关闭该方法范围内的所有对象?抛出异常后,关闭并处置方法中的对象的代码将无法再访问.
Vot*_*ple 43
该方法试图做三件事:
从设计的角度来看,这非常混乱.
更好的方法是简单地声明:
public static List<Poll> GetPolls()
Run Code Online (Sandbox Code Playgroud)
Exception如果出现任何问题,请让这个方法抛出.
Tim*_*ter 11
我相信
public static bool TryGetPolls(out List<Poll> polls)
Run Code Online (Sandbox Code Playgroud)
会更合适.如果方法是a,TryGet那么我最初的假设就是有理由期望它失败,并且调用者有责任确定下一步该做什么.如果调用者没有处理错误,或者想要错误信息,我希望他们调用相应的Get方法.
Gre*_*ech 11
这绝对不是编写C#的惯用方式,这也意味着它可能也不是一个好的风格.
当你有一个TryGetPolls方法然后它意味着你想要结果如果操作成功,如果没有,那么你不关心为什么它不成功.
当你只有一个GetPolls方法然后它意味着你总是想要结果,如果它没有成功那么你想知道为什么以一个形式Exception.
混合两者介于两者之间,对大多数人来说这是不寻常的.所以我会说要么不返回错误消息,要么抛出Exception失败,但不要使用这种奇怪的混合方法.
所以你的方法签名应该是:
IList<Poll> GetPolls();
Run Code Online (Sandbox Code Playgroud)
要么
bool TryGetPolls(out IList<Poll> polls);
Run Code Online (Sandbox Code Playgroud)
(请注意,我在两种情况下都返回一个IList<Poll>而不是一个List<Poll>,因为编写抽象而不是实现也是一种好习惯.)
作为一般规则,我会说不.
我说不的原因实际上并不是因为你正在执行TryGetX并返回bool带out参数的a.我认为这样的风格很糟糕,因为你还会返回一个错误字符串.
该Try只应忽略一个特定的,通常遇到的错误.其他问题可能仍然会在适当的异常消息中引发异常.请记住,这样的Try方法的目标是当您期望特定的,单一类型的故障更频繁地发生时,避免抛出异常的开销.
相反,你正在寻找的是一对方法:
public static bool TryGetPolls( out List<Poll> polls );
public static List<Poll> GetPolls();
Run Code Online (Sandbox Code Playgroud)
这样,用户可以做适当的事情并且GetPolls可以实现TryGetPolls.我假设你的static语境在上下文中有意义.
考虑回归:
对我来说,多个输出参数是代码味道.该方法应该只做一件事.
考虑使用以下方法引发和处理错
throw new Exception("Something bad happened");
//OR
throw new SomethingBadHappenedException();
Run Code Online (Sandbox Code Playgroud)