如何提示方法不成功我有几个类似的方法,例如。CalculatePoint(...)和CalculateListOfPoints(...)。有时,他们可能不会成功,这需要向调用者表明。对于返回通用列表的CalculateListOfPoints,我可以返回一个空列表并要求调用者检查它;但是Point是一个值类型,所以我不能在那里返回null。理想情况下,我希望这些方法“看起来”相似;一种解决方案可能是将它们定义为publicPointCalculatePoint(...outBooleanboSuccess);publicListCalculateListOfPoints(...outBooleanboSuccess);还是退一分?对于CalculatePoint,返回null表示失败。这意味着必须回退到不可为空的类型,这看起来有点矫枉过正。另一种方法是返回布尔值boSuccess,将结果(Point或List)作为“out”参数,并将它们称为TryToCalculatePoint或其他名称……最佳做法是什么?编辑:我不想使用异常进行流量控制!有时会失败。就个人而言,我认为我会使用与TryParse()相同的想法:使用out参数输出实际值,并返回一个布尔值,指示调用是否成功publicboolCalculatePoint(...outPointresult);我不喜欢对“正常”行为使用异常(如果您希望该函数不适用于某些条目)。他们为什么会失败?如果是因为调用者所做的事情(即提供的参数),则抛出ArgumentException是完全合适的。避免异常的Try[…]方法很好。我认为提供一个抛出异常的版本是个好主意,因此如果调用者希望他们始终提供良好的数据,那么如果他们错了,就会得到一个适当的强烈消息(即异常)。另一种方法是抛出异常。但是,您通常只想在“异常”中抛出异常。如果失败案例很常见(并非例外),那么您已经列出了两个选项。编辑:您的项目中可能有一个约定如何处理此类非特殊情况(是否应返回成功或对象)。如果没有现有约定,那么我同意lucasbfr并建议您返回成功(这与TryParse(...)的设计方式一致)。如果它由于特定原因而失败,那么我认为它可能会返回null或bool并有一个out参数。但是如果无论失败都返回null,那我就不推荐了。该异常提供了有关失败原因的大量信息,如果您返回所有空值,您如何知道这是因为数据错误、内存不足还是其他一些奇怪的行为。即使在.net中,TryParse也有一个Parse兄弟,因此您可以根据需要获取异常。如果我提供一个TrySomething方法,我也会提供一个在失败时抛出异常的Something方法。然后由调用者决定。我使用的模型与MS用于各种类的TryParse方法的模型相同。您的原始代码:publicPointCalculatePoint(...outBooleanboSuccess);publicListCalculateListOfPoints(...outBooleanboSuccess);将变为publicboolCalculatePoint(...out(orref)PointCalculatedValue);publicboolCalculateListOfPoints(...out(orref)ListCalculatedValues);基本上,您将获得成功/失败作为返回值。总而言之,您可以采取以下几种方法:使用C#的Nullable特性并在返回类型为值类型时返回一个Point,例如Point?(又名Nullable)所以你可以在失败时返回null并在失败时抛出异常。关于什么是“特殊”和什么不是“特殊”的整个争论/讨论是有争议的,您决定什么是特殊行为是您的API。采用类似于Microsoft在Int32等基本类型中实现的模型,提供CalculatePoint和TryCalculatePoint(int32.Parse和int32.TryParse)并具有throw和returnbool。从具有两个属性boolSuccess和GenericTypeValue的方法返回一个通用结构。根据情况,我倾向于使用返回null或抛出异常的组合,因为它们对我来说看起来“最干净”并且最适合我工作的公司的现有代码库。所以我个人的最佳实践是方法1和方法2。这主要取决于你的方法的行为及其用法。如果失败很常见且不严重,则让您的方法返回一个布尔值以指示其成功,并使用输出参数来传达结果。在散列中查找键,在没有数据可用时尝试在非阻塞套接字上读取数据,所有这些示例都属于此类。如果失败是意外的,直接返回结果并传达异常错误。以只读模式打开文件,连接到TCP服务器,是一个不错的选择。有时双管齐下是有意义的……返回Point.Empty。当您想要检查结构创建是否成功时,返回特殊字段是.NET设计模式。尽可能避免输出参数。publicstaticreadonlyPointEmpty我正在尝试的模式是返回一个Maybe。它具有TryParse模式的语义,但具有与错误返回null模式类似的签名。我还不确定是哪一种方式,但我提供它供您集体考虑。它的优点是不需要在方法调用之前定义变量以在方法的调用站点保留参数。它还可以使用错误或消息集合进行扩展,以指示失败的原因。Maybe类如下所示://////表示可能失败的操作的返回值//////publicstructMaybe{T_value;布尔_hasValue;publicMaybe(Tvalue){_value=value;_hasValue=真;}publicMaybe(){_hasValue=false;_value=默认值(T);}publicboolSuccess{get{return_hasValue;}}publicTValue{get{//如果_hasValue为假,则可能抛出异常return_value;我认为最好的做法是返回一个表示成功的值,一个表示失败的异常。在您提供的示例中,我认为没有理由在发生故障时不使用异常。在某些情况下使用异常不是一个好主意(尤其是在编写服务器时)。你需要两种方法。还要查看字典类以了解您应该做什么。//注意:布尔值是返回值。//这使得将这个野兽放在if语句中成为可能。publicboolTryCalculatePoint(...outPointresult){}publicPointCalculatePoint(...){Pointresult;if(!TryCalculatePoint(...outresult))thrownewBogusPointException();返回结果;}两全其美!boolTrySomething()至少是一个练习,可以与.net的解析方法一起使用,但我不认为我喜欢它。抛出异常通常是一件好事,但它不应该用于您希望在许多正常情况下发生的情况,并且它具有相关的性能成本。在大多数情况下,如果不需要异常,则尽可能返回null。但是-您的方法有点程序化-您如何创建类似于PointCalculator类的东西-将所需数据作为构造函数中的参数?然后对其调用CalculatePoint,并通过属性访问结果(Point和Success的单独属性)。您不想在预期会发生某些事情时抛出异常,因为@Kevin指出异常是针对特殊情况的。你应该返回一些预期的“失败”,通常是我选择的糟糕回报。你的方法的文档应该告诉用户当不计算数据时会发生什么。我们曾经写过一个完整的框架,所有的公共方法都返回true(执行成功)或false(发生错误)。如果我们需要返回一个值,我们使用输出参数。与流行的看法相反,这种编程风格实际上简化了我们的很多代码。使用Point,您可以将Point.Empty作为失败时的返回值发回。现在所有这一切真的是返回0和X值的要点,所以如果它可以是有效的返回值,我会远离它,但如果你的方法从不返回(0,0)点,那么你可以使用它。抱歉,我只记得Nullable类型,你应该看看。我不太确定开销是多少。以上就是C#学习教程的全部内容:如何提示方法不成功。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
