在表面值看來,對象初始值設定程序似乎對.net 4.0「代碼契約」提出了一個問題,其中通常應該在對象構造函數完成時建立不變量。然而,可能的是,對象初始化器需要在構建完成後設置屬性。對象初始值設定項(.net 4.0)
我的問題是,如果「代碼合約」的不變量能夠處理對象初始值設定項,「好像」屬性是在構造函數完成之前設置的?這將是非常好的!
在表面值看來,對象初始值設定程序似乎對.net 4.0「代碼契約」提出了一個問題,其中通常應該在對象構造函數完成時建立不變量。然而,可能的是,對象初始化器需要在構建完成後設置屬性。對象初始值設定項(.net 4.0)
我的問題是,如果「代碼合約」的不變量能夠處理對象初始值設定項,「好像」屬性是在構造函數完成之前設置的?這將是非常好的!
那麼,我想代碼合同可能插入一個額外的調用對象初始值設定項的末尾不變 - 如果它可以告訴它正在使用。 (不要忘記,它主要使用IL而不是源代碼;據我所知,源代碼僅用於生成錯誤消息。)
儘管這是一個糟糕的設計,由對象初始化器的不幸本質。對於之後的對象初始值設定項,您將如何設置屬性?他們可能會使對象再次失效。
這聽起來像你基本上希望至少有一些屬性是不可改變的,但是你希望得到對象初始化器簡單性的好處。命名參數和C#4可選的參數給你一些這一切 - 創造一切適當的屬性(和默認值)構造函數,那麼你可以這樣調用:
Person person = new Person(firstName: "Jon", lastName: "Skeet");
這是爲期不遠的對象初始化語法:
Person person = new Person { FirstName = "Jon", LastName = "Skeet" };
它的效果並不理想,我希望C#有恆定類型(包括創建和使用)的支持,但它是一個開始......
我同意,對C#中不可變類型的更多支持會很棒。 – Steven 2010-05-02 10:44:00
Hip Hip Hooray用於命名參數和可選參數!自從跳船之後,我錯過了VB中少數幾個VB特性。 – 2010-05-02 10:58:27
@Jon:實際上「在對象初始值設定項後面設置屬性」並不會讓我警覺 - 因爲客戶端負責不打破與每個屬性相關的先決條件。我只是想避免這樣一種情況,即我實際上不能提供一個不變量,因爲對象初始值設定項和代碼合約不相處。聽起來像陪審團不在目標初始者那裏,正如你所說的,「當代碼契約*可以在對象初始化器完成時調用一個不變量。」但看起來更可能的是,可選/默認參數在代碼合同中會起到很好的作用 – 2010-05-02 16:52:33
這是爲http同樣的問題:/ /stackoverflow.com/questions/2656548/ioc-container-handling-state-params-in-non-default-constructor?如果是這樣,它就更清晰了,但是如果不是這樣,也許你應該強調這一點有什麼不同...... – 2010-05-02 07:26:00