Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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

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
.net 什么时候是“a”;试一试;方法优先于“a”;空";结果如何?_.net_Design Patterns - Fatal编程技术网

.net 什么时候是“a”;试一试;方法优先于“a”;空";结果如何?

.net 什么时候是“a”;试一试;方法优先于“a”;空";结果如何?,.net,design-patterns,.net,Design Patterns,在.NET Framework(泛型出现前后)中,出现了Try[method]模式,以帮助处理需要指示操作未成功完成而不引发异常的情况 在故障被视为正常(如解析)而非异常的情况下,这显然是一种理想的模式 但是,如果一个方法可以返回null以表明它未能成功获取值(例如在Find方法的情况下),那么这是否比使用返回值明确指示成功或失败的TryFind方法更正确?.NET Framework对此模式有任何先例吗?异常不应用于流控制或方法的结果。当然,这条规则总有例外。这是使用TryParse而不是Tr

在.NET Framework(泛型出现前后)中,出现了
Try[method]
模式,以帮助处理需要指示操作未成功完成而不引发异常的情况

在故障被视为正常(如解析)而非异常的情况下,这显然是一种理想的模式


但是,如果一个方法可以返回
null
以表明它未能成功获取值(例如在
Find
方法的情况下),那么这是否比使用返回值明确指示成功或失败的
TryFind
方法更正确?.NET Framework对此模式有任何先例吗?

异常不应用于流控制或方法的结果。当然,这条规则总有例外。这是使用
TryParse
而不是
Try

的部分原因。相当多的TryParse方法返回值而不是对象,这意味着它们不能返回null。当然,随着Nullable的引入,它们可以被编写为返回null,但是null被定义为“无信息”。如果出现语义不正确的异常/错误。成功时返回true,失败时返回false清楚地表示了此信息。 如下文所述,这也与.NET framework中的TryParse方法的设计相一致。它们与Nullable同时引入
您还可以避免使用返回值时不检查null,这比忘记检查TrySomthing方法的结果更容易出错。返回类型的问题是您需要检查它-这可能不明显,而且很容易忘记

使用
Try*
type方法可以使流程更加清晰


话虽如此,存在的原因正是返回null的问题——它允许您为您的类型使用“null”对象,一个表示中性值的有效对象。

一个原因是当您返回的结构不能为
null
,即
double.TryParse()

  • 正常值类型不支持
    null
    。虽然存在可为空的值类型,但泛型不支持这样的构造:如果
    t
    是值类型,则返回
    t?
    ;如果
    t
    是引用类型,则返回
    t
  • 在支持
    null
    的类型上,
    null
    是有效值。用户可能希望区分缺少的条目和
    null
    的条目
  • 另一方面,可以定义返回的
    选项
    结构。这种类型在其他地方也很有用(例如可选参数)


    有趣的是,当元素不存在时,非泛型的
    哈希表
    类在其索引器中返回
    null

    与指定键关联的值。如果找不到指定的键,则尝试获取它将返回null,并尝试设置它将使用指定的键创建新元素

    要区分由于找不到指定键而返回的null和由于指定键的值为null而返回的null,请使用Contains方法或ContainsKey方法确定列表中是否存在该键


    我相信TryX模式早于.NET2.0中添加的
    Nullable
    类型
    Nullable
    解决了值类型问题以及默认类型值是否有效/无效之间的潜在差异。然而,即使有了这些补充,我相信TryX模式仍然有价值

    TryX模式的两个主要优点是:

    • 返回值没有歧义
    • 例外情况下的安全
    Nullable
    类型消除了歧义,但不提供异常安全性


    我不相信有一个具体的优先级集,但是如果您的方法需要保证这些,那么我将使用TryX模式

    对于返回类类型的方法,我更喜欢在失败时返回null的
    TryGetFnord()
    方法,而不是返回
    bool
    并将其结果存储在
    ref
    参数中的方法。除其他外,可以在协变接口中包含前一种样式,而不能使用后一种样式。但是,我建议在名称中保留“Try”,以表明该方法可能失败


    另一种考虑的方法是:<代码>数据类型TyGETFNORD(REF TrGETFNORESREST结果),其中代码> TyGETFRNDRESUB/<代码>可以是一个值类型或不可变的类类型,它指示操作是否成功。这将保留协方差相关的优势,同时允许返回比通过-失败更有用的信息。如果操作失败,它可能会返回其类型的默认值,但是调用方应该使用

    result
    参数检查失败。

    我看不到OP建议使用异常作为流控制(实际上相反),这是:“null是一个有效值。用户可能希望区分丢失的条目和空条目。“+1框架2.0中引入了
    TryParse
    方法,这与引入的
    Nullable
    版本相同。这个概念是存在的,但设计师们决定采取不同的方法。@Programmingero有点像我的观点:)我现在已经试着说得更清楚了,谢谢你的评论(TryParse的方法比在.NET中引入的方法更古老)但是可以重写它来返回Nullable,我不认为它应该首先考虑,这个方法是在引入
    Nullable
    之前实现的。此外,BLC中的常见模式用于
    Parse