2014-07-10 48 views
2

是否可以在F#中創建一個簡單的公共可變字段?我正在創建一個庫,我將從C#程序訪問,我需要能夠從C#設置字段。對象中的公共可變字段

//C# Equivalent 
public class MyObj 
{ 
    public int myVariable; 
} 

//F# 
type MyObj = 
    //my variable here 

    member SomeMethod() = 
     myVariable <- 10 

//C# Usage 
MyObj obj = new MyObj(); 
obj.myVariable = 5; 
obj.SomeMethod() 
+0

是對您的圖書館有必要揭露這是一個領域或將財產也沒事的?一個自動實現的屬性也是F#中的一個班輪。我認爲主要的兩個區別是你可能會在屬性中產生副作用(而不是你的代碼似乎表明的),並且一個字段可以作爲out/ref參數。 – Bram

回答

3
type MyObj() = 
    [<DefaultValue>] 
    val mutable myVariable : int 
    member this.SomeMethod() = 
     this.myVariable <- 10 

可以去掉[<DefaultValue>]如果沒有主構造,但這種處理更常見的情況。

2

如何:

[<CLIMutable>] 
type MyObj = 
    { mutable myVariable : int } 
    member x.SomeMethod() = 
     x.myVariable <- x.myVariable + 10 

然後,你可以這樣做:

var obj = new MyObj(); 
obj.myVariable = 5; 
obj.SomeMethod(); 

var obj = new MyObj(5); 
obj.SomeMethod(); 
+0

通過使用'CLIMutableAttribute'裝飾,您正在編譯一個沒有構造函數的F#記錄類型作爲Plain-Old CLR對象,而是使用默認構造函數和屬性getters和setter。 – kaefer

+0

@kaefer,yup ... – ebb