簡體   English   中英

F#對象構造函數

[英]F# Object constructor

在經過很長一段時間的F#之后,我最近發現了一些C#,我開始意識到“對象構造函數”是一種欺騙自己相信它們正在處理功能對象的好方法。

考慮:

let x = new Something()
x.Key <- 1
x.Value <- 2

由於價值觀的突然變化,這種感覺非常不潔凈。 特別是如果我們保持對象只寫一次,感覺非常不必要在C#中,可以像這樣初始化對象:

var x = new Something() { Key = 1, Value = 2 };

這看起來更好,實際上感覺就像我正在使用一個記錄(幾乎),顯然它只是糖,但它的好糖。

問:假設我們無法控制“Something”(假裝來自某個C#庫),是否有可能在F#中使用這種速記初始化,如果沒有,為什么呢?

是的,你可以這么做。 它看起來像這樣:

let x = new Something(Key = 1, Value = 2)

語法在構造函數(F#)中的“ 在初始化時為屬性分配值 ”部分中詳細說明。

是的,F#支持類似於C#對象初始化器的用例,但F#方法更通用。 F#規范14.4方法應用分辨率說:

(在方法成功解決之后)按照以下步驟構建生成的詳細表達式:

  • 對於目標是可設置屬性或字段的每個NamedActualArgs,將值分配給屬性。

這意味着你可以做C#不允許的事情

type Something() = 
    member val Key = 0 with get,set
    member val Value = "" with get,set
    static member Create() = Something()

let a = Something(Key = 1, Value = "1") // create instance with constructor, set properties afterwards
let b = Something.Create(Key = 1, Value = "1") // create instance using factory method, set properties afterwards

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM