C#

时间:2016-11-28 05:26:37

标签: c# swift

来自Swift编程语言,我已经习惯了optional values的范例。这个语言功能有很多很酷的方面,但我特别想知道C#是否具有相同的处理方式,即nil函数返回值。例如,一个简单的查找函数,它返回给定键的值。在Swift中,处理缺失键的惯用方法是简单地返回nil。实际上,这可以防止程序员在绝大多数情况下抛出错误或执行错误处理,并且它非常优雅。同样,在Javascript中,我可能只返回undefined

从我在MSDN上看到的内容来看,似乎C#程序员通常会在这种情况下支持经典异常,并在try catch块中处理它们。通常情况如此吗?例如,在Nullable对象中包装整数返回值并让函数调用者检查该值是否为null会不常见?这些情况的正统方法是什么?

2 个答案:

答案 0 :(得分:3)

例外情况适用于特殊情况,而不适用于常规程序流程。我想我们在同一边。

当您的方法检查可用性获取资源时,您只需要额外的返回“类型”,如null。以代码来获取文件的内容:

if (File.Exists(...))
{
    return false;
}

string contents = File.ReadAllText(...);
...
return true;

这不需要例外或null返回值,如果文件在之间删除检查并打开文件,则可以将其视为例外情况。

但是,当尝试从数据库中获取实体时,您需要组合可用性检查并获取资源,以便只需要一个查询。实际上有很多程序员确实返回null,但由于没有C#法则很难跟踪哪种方法可以做什么。

我个人喜欢bool TryGet(int id, out Entity entity)样式,它清楚地表明它会进行可用性检查并在找到时获取资源。如果您希望返回null并希望更明确地了解您的函数的功能,则可以使用Entity GetOrDefault(int id)作为命名约定。一些框架方法(即Linq)以这种方式命名。

如果返回值类型,返回Nullable<>可能已经说明了您的方法。要完成这个圈子,C#7将(据我所知)添加non-nullable reference types

最后,由您(以及您的团队)决定您喜欢的惯例。

答案 1 :(得分:0)

C#中没有选项类型,在F#中有一个你可以在C#中滥用的选项类型。

有关详细说明,请参阅此处: Using F# option types in C#

或者参考C.Evenhuis发布的C#方式。