在 C# 中,可以像这样定义一个公共静态只读字段:
namespace MyNamespace
{
public static class MyClass
{
public static readonly string MyValue = "Test";
}
}
Run Code Online (Sandbox Code Playgroud)
在 F# 中,我能想到的最符合上述定义的代码是:
namespace MyNamespace
module MyClass =
[<Literal>]
let MyValue = "Test"
Run Code Online (Sandbox Code Playgroud)
但这实际上转化为以下 C# 片段:
namespace MyNamespace
{
public static class MyClass
{
public const string MyValue = "Test";
}
}
Run Code Online (Sandbox Code Playgroud)
如何在 F# 中定义公共静态只读字段?const
对我来说不是一个选择,因为我想使用不同的程序集。
只需删除该Literal
属性并使用 let-bound 值即可:
module MyClass =
let MyValue = "Test"
Run Code Online (Sandbox Code Playgroud)
这将编译为静态仅 getter 属性的等效项(ILSpy 生成的 C#):
public static string MyValue
{
[DebuggerNonUserCode, CompilerGenerated]
get
{
return "Test";
}
}
Run Code Online (Sandbox Code Playgroud)
如果该值涉及计算(而不是像您的情况那样是文字),那么它实际上会被绑定为模块底层内部类中的静态只读字段(并在 getter 主体中引用)。如果您愿意,您可以使用 ILSpy 自行验证。
也就是说,如果您对编译器生成的实际 IL 感兴趣 - F# 作为一种语言没有单独的只读字段概念(因为 let 绑定值、记录字段等默认情况下是只读的)。它甚至不保留关键字。
归档时间: |
|
查看次数: |
1033 次 |
最近记录: |