2014-05-24 23 views
2

迄今爲止我讀過的結構的所有例子都是當所有字段都是可變的或所有字段都是不可變的。因此,該編譯罰款:如何用一個可變字段和一個不可變字段初始化一個結構體?

[<Struct>] 
type Number(x:int) = 
    member this.X = x 

所以做到這一點:

[<Struct>] 
type Number = 
    val mutable X:int 
    new(x) = {X = x} 

不過,我不知道如何寫一個明確的構造函數有一個字段可變的,一個不可改變的一個STRUC:

[<Struct>] 
type Numbers(x:int) = 
    member this.X = x 
    val mutable Y:int 
    new(x,y) = ??? 

顯式構造函數必須清楚地調用隱式構造函數。迄今爲止我嘗試過的所有天真的解決方案都失敗了。

後續問題:不管解決方案是什麼,將字段Y分配一次或兩次(第一次使用默認值)?

回答

3

第二個示例中使用的顯式構造語法適用於所有結構,無論它們是否具有可變字段。

我們也可以重寫第一個使用該語法的示例,雖然它不太好看。還有一個技術差異,member this.X定義了一個屬性,而val X定義了一個字段。

在第三種情況下,你這樣寫:

[<Struct>] 
type Numbers = 
    val X : int 
    val mutable Y : int 
    new(x, y) = { X = x; Y = y } 

這僅明確分配Y一次。

+0

謝謝!做'val X'和'member this.X'只在使用的構造函數中有所不同?如果是這樣,那麼爲什麼Microsoft在http://msdn.microsoft.com/zh-CN/library/dd469494.aspx中聲明「顯式字段不適用於例行使用」? – Arbil

+0

實際上,'member this.X'是一個/屬性/,而不是字段 - 儘管編譯器最終會將構造函數參數'x'放入字段中,以便屬性實現可以訪問它。所以他們是兩個截然不同的東西,即使他們看起來一樣。我應該在我的回答中提到這一點,我會編輯它。 –

+0

我明白了。謝謝! – Arbil

相關問題