2010-05-31 34 views
5

這3種類型的鎖是壞明顯。 什麼其他類型的鎖是壞? 是否有這將抓住這個? 了StyleCop/FxCop的規則,如果沒有,那麼請你幫我一個自定義的規則實現呢?他們爲所有這些代碼必須相似,對不對?有其發出警告鎖(本),鎖(typeof運算,鎖(<string obj>等一個.net了StyleCop規則?

謝謝。

+1

了StyleCop只檢查編碼風格,而不是行爲。如果你需要這個規則,FxCop就是這個工具。 – Steven 2010-05-31 20:28:45

+0

愚蠢的問題:當我在VS2010中右鍵單擊一個C#項目並選擇「運行代碼分析」...是FxCop還是其他工具?另外:如果我想檢測一個案例,當一個異常被重新拋出並且堆棧跟蹤已被切斷 - 這也是FxCop的一個工作? – 2010-05-31 20:36:35

+0

奇怪的是,您一直在尋找不能勝過編輯器的查找功能的工具 – 2010-05-31 21:57:21

回答

3

samples(您可能需要允許在你的瀏覽器彈出窗口)約翰羅賓斯Debugging Microsoft .NET Applications書包含這樣的FxCop規則(DoNotLockOnPublicFields,DoNotLockOnThisOrMe,DoNotLockOnTypes等)的來源。看起來他們最初是爲FxCop 1.35製作的,而VS 2008和最新的獨立版本的版本是1.36(不是說VS2010)。所以他們可能需要一些調整,YMMV。

還有治CA2002(不要鎖定弱身份對象),其檢查的東西一樣lock(typeof(...)),但不適用於lock(this)

+0

非常好,基督徒,謝謝! – 2010-06-01 14:44:03

+0

@Mark Byers:我更新了鏈接。感謝您告訴。 – 2011-11-21 10:53:46

1

基本上,您不應該鎖定任何外部對象,除非這是特定的鎖定對象(例如非通用上的SyncRoot屬性是專爲)。這樣做會帶來引用的其他「用戶」也會鎖定它的風險,從而導致不必要的鎖定甚至死鎖。

顯然,thistypeof()是由定義的外部對象。字符串是不可變的,並且字符串文字都是實體的,所以即使您直接將其分配給對象,也可以在不同的地方使用相同的引用。

我不知道這些StyleCop規則,但我沒有很好的概述什麼可用於StyleCop或FxCop,所以很可能是在野外檢查這些情況。我會檢查只在不是字符串的私人成員上進行同步,並且不會直接在任何屬性或方法中返回。

+0

順便說一下,字符串是不可變的,但CLR也不會生成多個具有相同值的文字常量,例如:'const string l1 =「lock」;''和'const string l2 =「lock」;''l1'和'l2'同時在鎖語句中使用時可以啓動一個。 – 2010-05-31 20:25:47

+1

甚至可以在AppDomain之間共享字符串,更進一步的僵局。 – Steven 2010-05-31 20:27:05

+0

不錯,史蒂文......看起來像.Net的'lock'功能可能是以低調的方式設計的(事後看來)。我希望別人會指出更常見的'lock'危險用法。 – 2010-05-31 20:34:58