2010-05-31 10 views
5

Questi 3 tipi di blocco sono apparentemente male. Che altro tipo di blocco è un male? Ci sono regole StyleCop/FxCop che avrebbe raggiunto questo? Se no, allora voi prego mi aiutano con un'implementazione regola personalizzata? Hanno il codice per tutti loro devono essere simili, giusto?C'è una regola Net StyleCop che mette in guardia sul Blocco (questo), blocco (typeof, blocco (<string obj>, ecc?

Grazie.

+1

StyleCop solo controlli di codifica stile e non il comportamento. Se hai bisogno di una regola per questo, FxCop è lo strumento per questo. – Steven

+0

domanda stupida: quando right-click un progetto C# in VS2010 e selezionare 'Esegui analisi del codice" ... è che FxCop, o qualche altro strumento anche:? Se voglio rilevare un caso quando un'eccezione viene ri-gettato e una traccia dello stack è stato cut-off - è che anche un lavoro di FxCop –

+0

dispari, si continuano a chiedere per gli strumenti che non possono sovraperformare funzionalità Find di un editor –

risposta

3

Il samples (potrebbe essere necessario consentire i popup nel browser) di John Robbins' Debugging Microsoft .NET Applications libro contengono fonti di tali norme FxCop (DoNotLockOnPublicFields, DoNotLockOnThisOrMe, DoNotLockOnTypes, etc.). Sembra che siano stati originariamente realizzati per FxCop 1.35, mentre la versione in VS 2008 e l'ultima versione standalone è la 1.36 (per non parlare di VS2010). Quindi potrebbero aver bisogno di qualche ritocco, YMMV.

C'è anche governare CA2002 (Non agganciare oggetti con identità debole), che controlla per cose come lock(typeof(...)), ma non per lock(this)

+0

Molto carino, Christian, grazie! –

+0

@ Marco Byers: ho aggiornato i collegamenti. Grazie per avermelo detto –

1

in sostanza, non si deve bloccare qualsiasi oggetto esterno a meno che non è specificamente un oggetto di bloccaggio (ad esempio la proprietà SyncRoot sulla non generico ICollection è stato progettato per). Ciò comporta il rischio che altri "utenti" del riferimento si blocchino anche su di esso, portando a blocchi indesiderati o addirittura a deadlock.

Ovvisamente, this e typeof() sono per definizione oggetti esterni. Le stringhe sono immutabili e le stringhe letterali sono tutte internate, in modo che lo stesso riferimento possa essere in se in luoghi diversi anche se lo si assegna direttamente nell'oggetto.

Non conosco una regola StyleCop per quelli, ma non ho una buona panoramica di ciò che è disponibile per StyleCop o FxCop, quindi potrebbe esserci qualcosa di interessante da verificare per quei casi. Verificerei la sincronizzazione solo sui membri privati ​​che non sono stringhe e non sono restituiti direttamente in alcuna proprietà o metodo.

+0

Tra l'altro, le stringhe sono immutabili, ma il CLR anche non genera più di una costante letterale con lo stesso valore, ad esempio:. 'l1 const string = "lock", 'e' const string L2 = "lock"; 'può scattare una quando' 'l1' e l2' sono entrambi utilizzati all'interno di un blocco di dichiarazione –

+1

e stringhe possono anche essere condivisi tra AppDomain, aumentando la possibilità. su deadlock ancora più lontano. – Steven

+0

Nizza, Steven ... sembra che la funzione 'lock' di .Net avrebbe potuto essere progettato in modo noob-amichevole (in un senno di poi). Spero che altri indicheranno altri usi pericolosi comuni di "lock". –