2017-05-02 30 views
4

在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

为什么不只是写C#代码和使用编译的代码在你的F#a la http://stackoverflow.com/questions/3901805/how-to-use-c-sharp-object-from-f? –

+2

为什么你特别需要一个只读字段?为什么你不能放弃'Literal'属性并且在那里有一个正常的允许值(编译成只有getter属性)? – scrwtp

+0

这两个选项(使用C#,下降Literal属性)是完全可行的,我只是想知道如果我错过了一些东西,允许我直接在F#中执行此操作。 –

回答

4

只需丢弃Literal属性并使用让结合值:

module MyClass = 
    let MyValue = "Test" 

这将编译为静态吸气剂仅属性的等效(ILSpy生成C#):

public static string MyValue 
{ 
    [DebuggerNonUserCode, CompilerGenerated] 
    get 
    { 
     return "Test"; 
    } 
} 

如果这个值涉及到一个计算(而不是像你的情况那样是一个文字),它实际上会被绑定为模块内部类的一个静态只读字段(并且在getter体中被引用)。如果你喜欢,你可以使用ILSpy验证你自己。

这就是如果您对由编译器生成的实际IL感兴趣的话--F#作为一种语言没有单独的只读字段的概念(如let-bound值,记录字段等是只读的默认)。它甚至不保留关键字。

0

你也许会使用公共常量在下面的例子中,你可以使用

public class Constants 
{ 
    public const string CONSTANT_VALUE = "MY CONSTANT"; 
} 

这将是对所有其他类可见,这将是简单