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