C# 这个有名字吗;模式;?
我想知道这个“模式”是否有一个名称,其中方法签名称为TrySomething,例如C# 这个有名字吗;模式;?,c#,design-patterns,C#,Design Patterns,我想知道这个“模式”是否有一个名称,其中方法签名称为TrySomething,例如int.TryParse,decimal.TryParse,等等 我的一位同事经常使用这种命名约定——他们不会返回值或引发异常,而是调用方法TryDoSomething,如果在处理过程中捕获到异常,则会通过out参数返回 编辑:我理解这个例子并不是关于TryParse方法是如何工作的。这就是发布此。。。我不知道该怎么称呼它。我同意这更像是一种命名惯例,而不是一种模式。谢谢大家的意见 编辑: 考虑在常见场景中可能抛出
int.TryParse
,decimal.TryParse
,等等
我的一位同事经常使用这种命名约定——他们不会返回值或引发异常,而是调用方法
TryDoSomething
,如果在处理过程中捕获到异常,则会通过out参数返回
编辑:我理解这个例子并不是关于TryParse方法是如何工作的。这就是发布此。。。我不知道该怎么称呼它。我同意这更像是一种命名惯例,而不是一种模式。谢谢大家的意见
编辑:
考虑在常见场景中可能抛出异常的成员的TryParse模式,以避免与异常相关的性能问题
为了实现TryParse模式,您提供了两种不同的方法来执行在常见场景中可能引发异常的操作。第一个方法X执行该操作,并在适当时抛出异常。第二个方法TryX不抛出异常,而是返回一个指示成功或失败的布尔值。成功调用TryX返回的任何数据都使用out(VisualBasic中的ByRef)参数返回。Parse和TryParse方法就是这种模式的示例
一个设计模式通常指的是一个与语言无关的总体概念,所以不,这不是一个模式。这可能是一个习语,但很可能只是一个命名约定,正如Aaron在一篇评论中正确地提到的那样。我可能会称之为。当您的代码通常会产生异常,而不是使用布尔值提前删除时,您可以从创建
TryX
中获益。如果您查看框架提供的方法,您会注意到TryX
变体存在于编写自己的IsValidX
方法的过程中,无论何时,只要编写自己的IsValidX
方法都非常简单或容易出错(或者经常在框架中执行)
如果必须捕获异常,那么将其包装到方法中是没有意义的。您所做的只是使调试输入问题变得更加困难。用户可能只看到失败方法的副作用,而不是使用一个好的堆栈跟踪来跟踪输入失败。更糟糕的是,在调试手头的问题时,开发人员可能必须重新创建迟钝的程序状态以影响故障模式
基本上,如果您事先知道某个操作会因异常而失败,那么提供一个伴随的
TryX
操作是合乎逻辑和适当的。这就是所谓的测试员-实干家模式。对操作的事后分析不是测试人员的行为,而是简单的异常处理,你可以称之为异常安全检查。它引导您从异常世界进入错误代码世界。但我不认为这是官方的
当您需要在例如C代码和托管代码之间搭建桥梁时,此模式很常见。我将其称为“希望我有选项
”模式(类似于“希望我有或者”模式——想象一下其中的e:Exception)
TryXYZ(在上面的示例中)使用布尔结果和out
参数模拟选项。(对于值类型,在本例中可能是null
——我怀疑int.TryParse
和friends的情况并非如此,部分原因是null的出现要晚得多)。通过out
返回异常更类似于这两种方法
在C#中,我不建议捕获异常只是为了将它们传递给out
参数,尽管一般来说(这个“规则”可能与支持歧视联合和模式匹配的语言不同)——我尝试1)正确处理它,不管定义如何,在特定情况下,很有可能是
out
;或者2)放开它,让来电者可以尝试同样的方法
(正如其他人指出的那样,这更像是一种惯例)
快乐编码。他们称之为测试员-实干家模式。是的。它被称为模式。首先,如果您的描述是准确的,那么int.TryParse及其同级根本就不是这样工作的 我承认,在我看来,这些方法有点错误,因为它们没有向调用者传达解析失败的原因,只是它失败了。在这方面,我希望看到更好的处理方法 事实上,在我看来,更好的方法是我在一个第三方库中看到的东西,我不记得了,但基本上他们有各种自定义类型,有这样一对Parse/TryParse方法,他们做了以下工作:
out
参数 int val;
if(int.TryParse("2", out val))
{
//do work with val
}
private void SetObj(object obj)
{
int thisInt = obj as int;
if(thisInt != null)
{
//do work
}
else
{
//handle issue
}
}