|
軟件約定稱為代碼約定,通過(guò)這一約定可以表示代碼正常工作所需的正式條件。 如果方法未按預(yù)期收到數(shù)據(jù)或生成的數(shù)據(jù)不符合預(yù)期的后置條件,代碼約定將導(dǎo)致代碼引發(fā)異常。 有關(guān)前置條件和后置條件的概述,您可能需要查看我上個(gè)月發(fā)表的文章 (msdn.microsoft.com/magazine/gg983479)。
代碼約定是 .NET Framework 4 的一部分,但同樣依賴于 Visual Studio 2010 中的一些功能,例如運(yùn)行時(shí)工具、與 MSBuild 集成以及“項(xiàng)目屬性”框中的屬性頁(yè)。 值得注意的是,僅編寫前置條件和后置條件是不夠的。 您還需要為每個(gè)項(xiàng)目啟用運(yùn)行時(shí)檢查功能才能使用軟件約定。 您可以通過(guò) Visual Studio 2010 中的“代碼約定”項(xiàng)目屬性頁(yè)來(lái)完成上述操作。
在本文中,我將討論您可以查看或選擇的各個(gè)選項(xiàng)的預(yù)定用途,并深入討論使用代碼約定中的參數(shù)驗(yàn)證可以執(zhí)行的最常見(jiàn)操作的重寫程序工具和實(shí)踐。
代碼約定屬性頁(yè)
應(yīng)在所有版本中還是僅在調(diào)試版本中實(shí)施代碼約定前置條件和后置條件? 實(shí)際上,這取決于您對(duì)軟件約定概念的理解。 它是設(shè)計(jì)工作的一部分嗎? 或者,它僅是一種調(diào)試措施?
如果它是設(shè)計(jì)功能,則沒(méi)理由剝離發(fā)行版中的約定。 如果它僅是一種調(diào)試技術(shù),當(dāng)在發(fā)布模式中進(jìn)行編譯時(shí),您不希望顯示它。
在 .NET Framework 中,代碼約定僅是此框架的一部分并且未融入任何語(yǔ)言。 這樣將更容易在項(xiàng)目中按版本配置它們。 因此,通過(guò)軟件約定的 .NET Framework 實(shí)現(xiàn),您可以決定實(shí)現(xiàn)約定的合適時(shí)間和地點(diǎn)。
圖 1 顯示 Visual Studio 2010 中的屬性頁(yè),通過(guò)此頁(yè)可以設(shè)置軟件約定為應(yīng)用程序工作的方式。 請(qǐng)注意,此類設(shè)置基于項(xiàng)目應(yīng)用,因此可以根據(jù)需要進(jìn)行調(diào)整。
圖 1 Visual Studio 2010 中代碼約定的屬性頁(yè)
您可以選擇選項(xiàng)配置(調(diào)試、發(fā)布等)并僅對(duì)該配置應(yīng)用設(shè)置。 這樣,您可以啟用代碼約定用于調(diào)試但不用于發(fā)布,而且更重要的是,您可以隨時(shí)改變決策。
運(yùn)行時(shí)檢查
若要啟用代碼約定,必須選中“執(zhí)行運(yùn)行時(shí)約定檢查”選項(xiàng)。 如果未選中此選項(xiàng),則在源代碼中顯示的任何約定說(shuō)明將可能不會(huì)產(chǎn)生任何效果(定義了 DEBUG 符號(hào)的任何版本中的 Contract.Assert 和 Contract.Assume 例外,但這不是很重要)。 復(fù)選框控制是否在每個(gè)編譯步驟結(jié)束時(shí)觸發(fā)重寫程序工具。 重寫程序是一個(gè)外部工具,用于對(duì)軟件約定進(jìn)行后處理并修改 MSIL 代碼,以及在合適的位置執(zhí)行前置條件、后置條件和固定條件檢查。
但是,請(qǐng)注意,如果您具有類似下面這樣的前置條件,則在關(guān)閉重寫程序時(shí)會(huì)得到運(yùn)行時(shí)斷言失敗:
Contract.Requires<TException>(condition)
NET技術(shù):Visual Studio 2010 中的代碼約定設(shè)置,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。