在C#中,可以定义一个公共静态只读字段,如下所示:
namespace MyNamespace
{
public static class MyClass
{
public static readonly string MyValue = "Test";
}
}
在F#中,我能想到的与上述定义最匹配的代码是:
namespace MyNamespace
module MyClass =
[<Literal>]
let MyValue = "Test"
但这实际上转换为以下C#片段:
namespace MyNamespace
{
public static class MyClass
{
public const string MyValue = "Test";
}
}
如何在F#中定义公共静态只读字段? const
不是我的选择,因为我想要work with different assemblies。
答案 0 :(得分:3)
只需删除Literal
属性并使用let-bound值:
module MyClass =
let MyValue = "Test"
这将编译为静态getter-only属性的等价物(ILSpy生成的C#):
public static string MyValue
{
[DebuggerNonUserCode, CompilerGenerated]
get
{
return "Test";
}
}
如果值涉及计算(而不是像你的情况那样是文字),它实际上将被绑定为模块底层的内部类中的静态只读字段(并在getter主体中引用)。如果您愿意,可以使用ILSpy验证自己。
如果您对编译器生成的实际IL感兴趣,那么F#作为一种语言并没有单独的只读字段概念(作为释放值,记录字段等默认为只读)。它甚至不保留关键字。
答案 1 :(得分:0)
你可以在下一个例子中使用公共常量,你可以使用
public class Constants
{
public const string CONSTANT_VALUE = "MY CONSTANT";
}
这对于所有其他类都是可见的,它会更简单