2011-04-01 18 views
13

有沒有什麼辦法可以將自動實現的屬性放在.NET中? (以及如果答案是'是')?自動實現的屬性上的代碼合同

(我假設使用從DevLabs .NET代碼合同)

+2

您是否嘗試過使用類invarients爲了這個目的?我懷疑這會起作用,除非在從自動支持設置器返回時不檢查不變量。 (我還沒有運行帶代碼合同的VS版本,所以我不能自己測試這個,我不知道我是否會用靜態檢查器來獲得一個版本.-() – 2011-04-02 23:11:05

+0

我不是很完美確定是否在項目的發佈版本中檢查不變式,因爲對於這種配置,我已經打開了「僅公共場景合同」選項,我只想在公共方法中處理Contract.Requires。如果我錯了,我會很高興 – wh1t3cat1k 2011-04-03 09:44:01

+0

但是我擔心我是對的:「...您可以添加不變的方法來強制執行數據完整性(第2.3節)...這些檢查 在您的運行時測試版本中實施「 – wh1t3cat1k 2011-04-03 09:48:02

回答

1

謝謝Porges。

我的錯誤是,我實際使用ReleaseRequires選項,這,的確,只有涉及通用版本的方法,Requires<T>的。

置於自動執行屬性上的不變量是確實變成了Requires前提條件,但它不是通用的 - 這就是爲什麼它不能使用此選項。

怎麼辦:

  • VARIANT 1.考慮使用代碼段和可愛Requires<T>,而不是自動實現的屬性 - 這使我們能夠使用所需類型的異常。

  • VARIANT 2. 更改代碼契約的選項的ReleaseRequiresPreconditions和隨意寫上自動性能不變 - 重寫器工具會自動改變他們進入Requires。但是,它們將是非通用的 - 這意味着,如果合同被破壞,將會引發ContractException,並且無法更改此行爲。

謝謝大家的幫助!

16

是的,這是可能的 - 所有這一切都需要的是你的合同條件添加到[ContractInvariantMethod]方法在你的類,然後添加相當於Requires前提,以自動set之三,和一個後置條件Ensures被添加到get。從的Reference

作爲示例示出第2.3.1節,在自動性質不變量變成:

  1. 甲前提條件設置器
  2. 一種用於吸氣劑的後置條件
  3. 的不變的基礎支持領域

並通過例如:

public int MyProperty { get; private set ;} 

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant (this.MyProperty >= 0); 
} 

「等同於下面的代碼:」

private int backingFieldForMyProperty; 
public int MyProperty 
{ 
    get 
    { 
    Contract.Ensures(Contract.Result<int>() >= 0); 
    return this.backingFieldForMyProperty; 
    } 

    private set 
    { 
    Contract.Requires(value >= 0); 
    this.backingFieldForMyProperty = value; 
    } 
} 

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant (this.backingFieldForMyProperty >= 0); 
... 
+0

這太棒了! – flakes 2017-10-15 01:05:10

相關問題