2011-04-03 54 views
3

我正在嘗試學習代碼合約,並瞭解它們有用的內容。代碼合同檢查線程親和力 - 好主意?

我有一個WPF應用程序,所以很多代碼必須專門在UI線程上運行。不少實用程序類只希望從UI線程中調用。

這是通過我的代碼撒這些好主意嗎?爲什麼是/不是?

Contract.Requires(Thread.CurrentThread == Application.Current.Dispatcher.Thread); 

靜態檢查器是否能夠可靠地檢查這些?

感謝您的任何意見!

回答

1

我認爲你是正確的想做出這些親和力檢查。它們是早期發現細微錯誤的好方法,但不是可以使用代碼合同靜態檢查的東西,如Henkdecyclone

我有一個名爲Ensure的靜態類,其方法Ensure.OnUiThread()包含與您所提及的完全相同的檢查。我用[Conditional("DEBUG")]來標記這一點,以免減慢/膨脹生產代碼。對我來說很好。

+0

可以對此進行一些靜態檢查。對於公共方法來說,它不能完成,但可以確定何時被標記爲限制爲一類線程的某個標記被限制爲不兼容的線程類。例如,如果我構成一個屬性並且具有'[ThreadRestriction(「UI」)] void UiThing(){// bad} [ThreadRestriction(「Background」)] void BackgroundThing(){UiThing(); },靜態檢查器可以檢測到BackgroundThing不應該調用ForegroundThing。微軟的合同似乎沒有提供這個。 – mdonoughe 2012-06-19 17:32:06

2

您的合同應該與您的代碼有關。 Dispatcher和Thread類不是你的,他們不受自己的合同守護。

因此,不,靜態檢查器將無法檢查這一點。

運行時檢查可能會工作,但它們對已經內置到庫中的調試檢查幾乎沒有影響。

1

方法的契約是「對於特定的有效輸入,給定的方法將產生有效的輸出」

在你的情況下,你沒有驗證你的方法的輸入。這就是爲什麼我不會推薦使用這種方法。

換句話說,這不會是一個合同,而只是某種驗證/斷言。