F#的类型扩充和类型扩展之间究竟有什么区别,我们真的需要它们吗?
是否存在一个比另一个更好的情况,反之亦然?
我问的是因为我最近在F#上做过讲座,讲师在那里谈到了这两个讲座,然后评论说他看不出两者都被包含在F#语言中的原因。
更新
好的,所以 Vladislav Zorov 链接到一个页面,其中包含在定义自己的类型和扩展时使用类型扩充的示例(或增加?)外部类型。
pad 指向MSDN页面的链接,他们称之为内在和可选类型扩展名。
两者似乎都说明了同样的事情。有人可以提供类型扩展的具体示例和类型扩充的另一个具体示例,以便明确说明这两件事究竟是什么?
答案 0 :(得分:10)
MSDN's Type Extensions page中的以下位是相关的(强调我的):
有两种形式的类型扩展稍有不同 语法和行为。 内在扩展是一个扩展 出现在同一个命名空间或模块中,在同一个源文件中,和 在与该类型相同的程序集(DLL或可执行文件)中 延长。 可选扩展程序是一个显示在外部的扩展程序 类型的原始模块,命名空间或程序集 延长。 类型为时,类型上会出现内部扩展 通过反射检查,但可选扩展没有。可选的 扩展必须在模块中,并且它们仅在范围内时 包含扩展程序的模块已打开。
可选扩展的目的很明确。它可以帮助您为不属于程序集的类型注入新功能。例如,FSharpx使用它来创建various helpers来解析基元类型:
open System
type Boolean with
static member parse x =
match bool.TryParse(x) with
| true,v -> Some v
| _ -> None
为什么你需要内在延伸呢?答案是它的便利性。我发现将类型定义细分为多个部分非常有用。
在许多F#库中,我看到了使用以下模式:类型定义 - >效用函数 - >内在延伸。通过这种方式,您可以在类型上定义复杂的实用程序函数,使它们在模块中可用,并且仍然可以直接在成员定义中使用它们。您可以查看F#PowerPack中的Complex type以查看模式。
修改强>
说实话,我经常交替使用类型扩展和类型扩充。重要的是它们是内在的还是可选的。
答案 1 :(得分:4)
他们是不同的东西。类型扩充,当在同一命名空间,模块和源文件中定义时,实际上在编译时成为该类型的一部分。类型扩展(对于模块和源文件之外的类型的a.k.a.类型扩充)是使用.NET扩展方法实现的。
它们都使用相同的语法,唯一的区别是你提到的类型是否在同一个命名空间和程序集中,即你是在扩充自己的代码,并且可以在编译之前将其他方法添加到你的类型中。
来源:http://tomasp.net/blog/fsharp-iii-oop.aspx
修改强>
这是一个术语混淆,他们都指的是同一件事 - 内在扩展是第一种类型扩充(即相同的命名空间和程序集) ,可选扩展是类型扩充的第二种类型(即第三方程序集,在博客文章中这是List<T>
扩充示例)。
我假设当你的讲师谈论类型扩充时,他指的是内在扩展,即第一类扩充,当他谈论类型扩展时,他正在谈论关于可选扩展或第二类扩充。