C# F类型如何转换为C类型?
如果在F#中,我有如下方法:C# F类型如何转换为C类型?,c#,f#,naming-conventions,C#,F#,Naming Conventions,如果在F#中,我有如下方法: drawBox drawSphere paintImage 他们会被转移到C#吗,完全一样 如果是这样的话,那么它不会破坏C#中的命名约定吗?在C#中,方法应该是PascalCase 或者我应该在F#中使用PascalCase来解决这个问题吗?type方法名称在F#和C#中都是相同的。如果您想在C#中使用PascalCase,您应该在F#中使用此命名约定,camelCase也是如此。您应该遵循 值得注意的是: 对于面向对象的代码,包括面向F的库,一定要使用.NE
drawBox
drawSphere
paintImage
他们会被转移到C#吗,完全一样
如果是这样的话,那么它不会破坏C#中的命名约定吗?在C#中,方法应该是PascalCase
或者我应该在F#中使用PascalCase来解决这个问题吗?type方法名称在F#和C#中都是相同的。如果您想在C#中使用PascalCase,您应该在F#中使用此命名约定,camelCase也是如此。您应该遵循 值得注意的是:
- 对于面向对象的代码,包括面向F的库,一定要使用.NET命名和大小写约定
- 对于F#模块中的公共函数和值,请使用PascalCase或camelCase。
camelCase通常用于设计为不合格使用的公共功能(例如,
),以及“标准收集功能”(例如,invalidArg
)。在这两种情况下,函数名的行为与语言中的关键字非常相似List.map
- 成员和类型应该始终是PascalCase,就像C一样#
- 模块中的let绑定实体可以是camelCase,但这种东西通常不会公开地暴露在库之外,而库是由C使用的#
camelCase
(特别是针对F#用户的模块)或PascalCase
此外,还有一个技巧可以使用(这在F#core库中用于实际编译为List.map
的函数,如List.map
)。您可以使用CompiledName
属性指定编译版本中的名称:
module Bar =
[<CompiledName("Foo")>]
let foo a = a + 1
模块条=
[]
设foo a=a+1
使用统一的命名约定可能更好,但如果您想为F#用户保留一个好的短名称,为C#用户保留标准的.NET名称,这是一个有趣的选择。好的,谢谢。由于我使用C#more,我可能会这样做。我只是想在这种情况下,它会破坏F#的命名约定。谢谢,出于好奇,你还知道F#中的自由函数是如何在C#中出现的吗?因为C#不能有像F#这样的自由函数。F#中的模块看起来像C#中的静态类。请注意,F#中的“顶级”代码位于模块中;e、 g.
Program.fs
中的顶级代码被编译成名为Program
的模块,因此C#将看到Program.blah
。但是,如果你想与C#进行互操作,请避免使用公共F#模块(根据文档中的建议)。换言之,阅读文档;我们花了很多时间收集这些信息来回答这些问题。谢谢Brian,我不知道你是F#devs的一员。顺便问一下,使用CompiledName属性是否也可以接受,就像Tomas在回复中提到的那样?这似乎是两全其美。你可以用它,但是。。。它还提供了两个世界中最糟糕的一面,因为它可能会混淆非语言特定资产(如文档)。指南文件没有推荐(甚至没有提及)。但是,指南文档再次引导您朝着一个不成问题的方向前进(只向C#公开名称空间/类型/成员,在这种情况下命名约定是相同的)。camelCase还通常用于定义模块级F#函数,这些函数应该在语义上“镜像”同名的现有成员。例如,Microsoft.FSharp.Core.String.length函数“镜像”System.String.length实例成员。为什么要投反对票?我的意思是指出命名约定适合我们,当混合环境有不同的约定时,我们可以做适合我们的事情,因为编译器/运行时无论如何都会做正确的事情;它产生的问题和它解决的问题一样多。我能说的最好的一点是,它对于FSharp.Core.dll(如果我们将F#runtime移到.NET Framework中,编译的名称必须与.NET保持一致,这就是最初促使CompiledName
的原因)。正如Brian所指出的,请只把它当作最后的选择。@布瑞恩,MITYA:最好使用一些统一的命名约定(FSARP.COR.DLL是一个证明:-)),但是可能会有<代码>编译名> /代码> ATTBUTBY可能是有用的,所以我认为值得一提。