2017-05-02 65 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"; 
} 

這將是對所有其他類可見,這將是簡單