Dot-Net
程式碼契約與。對像初始化器 (.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# 對不可變類型(創建和使用)有更多支持,但這是一個開始……