如何定义公共静态只读字段?

时间:2017-05-02 21:25:06

标签: .net f#

在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

2 个答案:

答案 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";
}

这对于所有其他类都是可见的,它会更简单