Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个有名字吗;模式;?_C#_Design Patterns - Fatal编程技术网

C# 这个有名字吗;模式;?

C# 这个有名字吗;模式;?,c#,design-patterns,C#,Design Patterns,我想知道这个“模式”是否有一个名称,其中方法签名称为TrySomething,例如int.TryParse,decimal.TryParse,等等 我的一位同事经常使用这种命名约定——他们不会返回值或引发异常,而是调用方法TryDoSomething,如果在处理过程中捕获到异常,则会通过out参数返回 编辑:我理解这个例子并不是关于TryParse方法是如何工作的。这就是发布此。。。我不知道该怎么称呼它。我同意这更像是一种命名惯例,而不是一种模式。谢谢大家的意见 编辑: 考虑在常见场景中可能抛出

我想知道这个“模式”是否有一个名称,其中方法签名称为TrySomething,例如
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方法,他们做了以下工作:

  • 定义一个泛型结构,其中既包含通过解析字符串获得的值,也包含传递解析结果的枚举类型的值
  • 所有TryParse方法都返回此结构,并且没有
    out
    参数
  • 解析方法只是调用TryParse方法,然后将该枚举的各种不成功结果转换为适当的异常
  • 在我看来,这里的主要问题是它不可扩展。如果我想使用他们的系统和类型,并添加我自己的原因,我不能这样做,但它的一些变体可以很容易地处理这个问题

    无论如何,int.TryParse方法在内部根本不会抛出任何异常。相反,它们会实际解析字符串,如果遇到无法处理的问题,它们只会返回false,就是这样,没有例外

    异常处理比没有异常的替代方法稍微贵一点,这就是为什么一些这样的核心方法针对性能进行了优化

    这就是为什么在我的评论中,我把你的模式称为愚蠢的,如果准确的话,因为你把例外结合起来了
     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
        }
    
    }