MiP*_*MiP 0 .net c# vb.net f# naming-conventions
根据F#组件设计准则,F#应该使用PascalCase.NET Framework命名约定。
假设我使用的是C#或VB.NET,并且想导入F#库,那么什么时候可以camelCase在该库中看到约定?
看一下FsCheck库,特别是它的Gen模块。(FsCheck源代码中还有其他示例,但这很容易阅读)。FsCheck设计为可在F#和C#中使用,并且Gen模块的设计反映出:
module Gen =
// ...
[<CompiledName("Map"); EditorBrowsable(EditorBrowsableState.Never)>]
let map f (gen:Gen<_>) = gen.Map f
[<CompiledName("Sized"); EditorBrowsable(EditorBrowsableState.Never)>]
let sized fgen = Gen (fun n r -> let (Gen m) = fgen n in m n r)
[<CompiledName("Sized"); CompilerMessage("This method is not intended for use from F#.", 10001, IsHidden=true, IsError=false)>]
let sizedFunc (sizedGen : Func<int,Gen<_>>) =
sized sizedGen.Invoke
Run Code Online (Sandbox Code Playgroud)
暂时忽略这些函数的实现,并查看它们的名称以及CompiledName每个函数的属性。当您map从F#调用该函数时,您将以调用它Gen.map,但是当您从C#使用该函数时,该CompiledName属性将使您看到带有name 的函数Gen.Map。与该sized函数类似,Gen.sized从F#代码调用时将调用该函数,Gen.Sized从C#调用时将以该名称显示。还请注意,还有另一个具有相同功能的函数CompiledName(从C#来看),但是F#代码在Gen.sized和之间有区别Gen.sizedFunc(如果您尝试使用F#编译器也会警告您Gen.sizedFunc(“该方法不适用于F#”),因为该重载需要C#代码使用的函数类型,并且纯粹是为了方便C#编码人员使用该库。(F#函数使用该FSharpFunc类型,Func在某些情况下其行为与C#类型不同)。
但是,您的问题不是“我应该如何编写F#库以便C#编码人员可以使用它?”。而是,您的问题是,“作为C#编码器,就命名约定而言,我应该对F#库有什么期望?” 这个问题的答案是:它取决于您使用的库。
正如您所指出的那样,《 F#组件设计指南》建议为设计用于调用代码的函数使用PascalCase名称。FsCheck是正确执行此操作的一个很好的例子。但是并非所有库都是出于易于从C#使用的目的而编写的。一些图书馆写仅使用它们思考其他F#代码,这些库将不必然符合设计指引,因为F#约定将使用驼峰的功能名称。
因此,尽管这不是一个完全令人满意的答案,但这是我能给您的最好的答案,因为我不知道您将使用哪个库。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |