这是不错的C#风格?

bur*_*1ce 10 c# coding-style

请考虑以下方法签名:

public static bool TryGetPolls(out List<Poll> polls, out string errorMessage)
Run Code Online (Sandbox Code Playgroud)

此方法执行以下操作:

  • 访问数据库以生成Poll对象列表.
  • 如果成功则返回true,errorMessage将为空字符串
  • 如果不成功则返回false,errorMessage将包含异常消息.

这是好风格吗?

更新:让我说我确实使用以下方法签名:

public static List<Poll> GetPolls()
Run Code Online (Sandbox Code Playgroud)

并且在该方法中,它不会捕获任何异常(因此我依赖调用者来捕获异常).如何处置和关闭该方法范围内的所有对象?抛出异常后,关闭并处置方法中的对象的代码将无法再访问.

Vot*_*ple 43

该方法试图做三件事:

  1. 检索并返回民意调查列表
  2. 返回表示成功的布尔值
  3. 返回错误消息

从设计的角度来看,这非常混乱.

更好的方法是简单地声明:

public static List<Poll> GetPolls()
Run Code Online (Sandbox Code Playgroud)

Exception如果出现任何问题,请让这个方法抛出.

  • @Michael:"尝试......"方法在特定情况下很好,在这种情况下,某些事情可能出错,但你不关心(或多或少).如果它可以合法地返回任何内容,那么它应该返回null/Nothing. (4认同)
  • 如果TryGetPolls可以合法地返回任何内容,那么它可能很有用. (3认同)

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>,因为编写抽象而不是实现也是一种好习惯.)


Gre*_*g D 7

作为一般规则,我会说不.

我说不的原因实际上并不是因为你正在执行TryGetX并返回boolout参数的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语境在上下文中有意义.


p.c*_*ell 7

考虑回归:

  • 一个空的集合
  • 空值

对我来说,多个输出参数是代码味道.该方法应该只做一件事.

考虑使用以下方法引发和处理错

throw new Exception("Something bad happened");
//OR
throw new SomethingBadHappenedException();
Run Code Online (Sandbox Code Playgroud)