2012-02-21 42 views
0

我有一個F#DLL和一個C#DLL。,綁定到一個來自c#庫的值

的C#庫有一個命名空間Library與包含一個成員FUND_BITS像這樣一類Toolbox

namespace Library { 
    public static class Toolbox { 
     public static uint FUND_BITS = 0; 
    } 
} 

,然後在F#庫我有一個綁定:

let bf = Library.Toolbox.FUND_BITS 

現在,我在庫中定義的幾個函數中使用了bf。當我更改FUND_BITS的值時,我認爲所有的F#函數都會使用更新的值,因爲我綁定了bf來引用Library.Toolbox.FUND_BITS,並且沒有聲明它是可變副本或任何東西。但是,我發現這些函數使用FUND_BITS的陳舊值而不是更新後的值。

我誤解了F#如何創建不可變的綁定值?如果是這樣,我一直沒能找到在將與變化更新的方式結合的方式,例如:

let bf = &Library.Toolbox.FUND_BITS 
+3

'uint'是一個值類型;爲什麼它應該有引用語義? – ildjarn 2012-02-21 21:30:17

+2

我想你想要一個別名,F#沒有的東西。 – Daniel 2012-02-21 21:43:54

+0

@ildjarn我知道我可能不完全準確地理解函數式編程範例,但我希望在這種情況下,因爲我將'bf'綁定到非常量值類型,並且沒有指定任何可變賦值,那麼默認行爲將作爲參考;如果我想在特定的時間點將'bf'固定爲'FUND_BITS'的某個值,那麼我需要使用除了常規'let'語句之外的其他構造。 – mattgately 2012-02-22 16:58:41

回答

5

不幸的是,在這種情況下,「綁定」是不一樣的東西「綁定「在用戶界面數據綁定的意義上說。行let bf = Library.Toolbox.FUND_BITS基本上是一個簡單的賦值語句。您會發現該類型推理顯示值bfuint32的一個實例。

如果您想要動態讀取該值,您需要使用一個函數,該函數在每次調用時都讀取靜態變量的值。

let bf = (function() -> Library.Toolbox.FUND_BITS) 

編輯這更簡潔的版本是由於Guvante

let bf() = Library.Toobox.FUND_BITS 

在這種情況下,bf將有一個類型的unit -> uint32

如果你想在這兩個值之間建立一個雙向鏈接,那麼你可以聲明一個屬性getter和setter,它使用靜態字段作爲後備存儲,但這隻會讓我感到害怕。更好的方法是隻要需要從中讀取或寫入,就直接引用該字段。

+2

'let bf()= Library.Toobox.FUND_BITS'是一個更緊湊的表示。 – Guvante 2012-02-21 23:08:50

+0

@Guvante非常感謝,我知道有一個,但想不到它足夠快。 – phoog 2012-02-21 23:09:41

+0

感謝您使用此解決方案。這是相當輕量級的,儘管我仍然希望有一些方法可以訪問'FUND_BITS'的當前值,而不用:'(bf())'的括號。 無法決定是否堅持使用此函數調用方法,或直接在每次訪問時放入術語'Library.Toolbox.FUND_BITS'。 – mattgately 2012-02-22 17:33:48

相關問題