2010-05-31 13 views
5

Estos 3 tipos de bloqueo son aparentemente malo. Qué otro tipo de bloqueo es malo? ¿Hay normas StyleCop/FxCop que coger esto? Si no es así, ¿podría por favor me ayudan con una aplicación de reglas personalizadas? ellos código para todos ellos deben ser similares, ¿verdad?¿Hay una regla .Net StyleCop que advierte acerca de bloqueo (este), bloqueo (typeof, bloqueo (<string obj>, etc.?

Gracias.

+1

StyleCop sólo comprueba estilo y no el comportamiento de codificación. Si necesita una regla para esto, FxCop es la herramienta para esto. – Steven

+0

Pregunta tonta: cuando hago clic derecho en un proyecto de C# en VS2010 y selecciono 'Ejecutar análisis de código' ... ¿es FxCop, o alguna otra herramienta? También: si quiero detectar un caso cuando se vuelve a lanzar una excepción y un rastro de pila ha sido cortado. ¿Es eso también un trabajo de FxCop? –

+0

Extraño, sigue preguntando por herramientas que no pueden superar la capacidad de búsqueda de un editor. –

Respuesta

3

El samples (es posible que necesite para permitir ventanas emergentes en su navegador) del libro de John Robbins Debugging Microsoft .NET Applications contienen fuentes de tales reglas FxCop (DoNotLockOnPublicFields, DoNotLockOnThisOrMe, DoNotLockOnTypes, etc.). Parece que fueron hechos originalmente para FxCop 1.35, mientras que la versión en VS 2008 y la última versión independiente es 1.36 (por no hablar de VS2010). Entonces podrían necesitar algunos ajustes, YMMV.

Existe también la regla CA2002 (No bloquear en objetos con identidad débil), que comprueba para cosas como lock(typeof(...)), pero no para lock(this)

+0

¡Muy bonito, Christian, gracias! –

+0

@Mark Byers: He actualizado los enlaces. Gracias por contarlo –

1

Básicamente, no debe bloquear ningún objeto externo a menos que sea específicamente un objeto de bloqueo (como la propiedad SyncRoot en elno genérico)fue diseñado para). Si lo hace, corre el riesgo de que otros "usuarios" de la referencia también se bloqueen, lo que provocará bloqueos no deseados o incluso bloqueos indeseados.

Obviamente, this y typeof() son por definición objetos externos. Las cadenas son inmutables y los literales de cadenas están todos internados, por lo que la misma referencia puede estar en trueque en diferentes lugares, incluso si la asignó directamente en su objeto.

No conozco una regla de StyleCop para ellos, pero no tengo una buena visión general de lo que está disponible para StyleCop o FxCop, por lo que podría haber algo extraño para verificar esos casos. Verificaría la sincronización solo en miembros privados que no son cadenas y que no se devuelven directamente en ninguna propiedad o método.

+0

Por cierto, las cadenas son inmutables, pero el CLR tampoco genera más de una constante literal con el mismo valor, por ejemplo: 'const string l1 = "lock"; 'y' const string l2 = "lock"; 'puede hacer saltar uno cuando' l1' y 'l2' se usan dentro de una sentencia de bloqueo. –

+1

Y las cadenas incluso se pueden compartir entre AppDomains, aumentando la posibilidad en puntos muertos aún más. – Steven

+0

Nice, Steven ... parece que la función 'lock' de .Net podría haber sido diseñada de una manera novo-amigable (en retrospectiva). Espero que otros señalen los usos peligrosos más comunes de 'lock'. –