2010-05-31 2 views
5

Diese 3 Arten von Schlössern sind anscheinend schlecht. Welche andere Art von Verriegelung ist schlecht? Sind da? StyleCop/FxCop Regeln, die das? Wenn nicht fangen würde, dann würden Sie mir bitte helfen mit einer benutzerdefinierten Regel Implementierung? Sie Code für alle von ihnen ähnlich sein müssen, nicht wahr?Gibt es eine .Net StyleCop Regel, die vor Lock (this), Lock (typeof, lock (<string obj> usw.) war?

Danke.

+1

StyleCop prüft nur Stil Codierung und nicht Verhaltens. Wenn Sie hierfür eine Regel benötigen, ist FxCop das Werkzeug dafür. – Steven

+0

Dumme Frage: Wenn ich mit der rechten Maustaste auf ein C# -Projekt in VS2010 klicke und 'Code-Analyse ausführen' wähle ... ist das FxCop, oder ein anderes Werkzeug? Auch: wenn ich einen Fall erkennen will, wenn eine Ausnahme neu geworfen wird ein Stack-Trace wurde abgeschnitten - ist das auch ein Job von FxCop? –

+0

Seltsam, du fragst immer nach Werkzeugen, die die Find-Fähigkeit eines Editors nicht übertreffen können –

Antwort

3

Die samples (möglicherweise müssen Sie Popups in Ihrem Browser ermöglichen) von John Robbins' Debugging Microsoft .NET Applications Buch Quellen für solche FxCop Regeln (DoNotLockOnPublicFields, DoNotLockOnThisOrMe, DoNotLockOnTypes, etc.) enthalten. Es sieht so aus, als wären sie ursprünglich für FxCop 1.35 gemacht worden, während die Version in VS 2008 und die neueste Standalone-Version 1.36 ist (um nicht von VS2010 zu sprechen). Also müssen sie vielleicht etwas optimiert werden, YMMV.

Es gibt auch regieren CA2002 (sperrt nicht auf Objekte mit schwacher Identität), die wie lock(typeof(...)) für Sachen überprüft, aber nicht für lock(this)

+0

Sehr schön, Christian, danke! –

+0

@Mark Byers: Ich habe die Links aktualisiert. Danke fürs Erzählen. –

1

Grundsätzlich Sie sollten kein externes Objekt sperren, es sei denn, es handelt sich speziell um ein Sperrobjekt (z. B. die SyncRoot-Eigenschaft für das nicht generische Objekt ICollection wurde für) entworfen. Dies birgt das Risiko, dass andere "Benutzer" der Referenz ebenfalls auf ihm blockieren, was zu unerwünschtem Sperren oder sogar Deadlocks führt.

Observiously, this und typeof() sind per Definition externe Objekte. Zeichenfolgen sind unveränderlich und Zeichenfolgenliterale sind alle interniert, so dass die gleiche Referenz an verschiedenen Stellen auch dann verwendet werden kann, wenn Sie sie direkt in Ihrem Objekt zugewiesen haben.

Ich kenne keine StyleCop-Regel für diese, aber ich habe keinen guten Überblick darüber, was für StyleCop oder FxCop verfügbar ist, also könnte es durchaus etwas in der Wildnis geben, um nach diesen Fällen zu suchen. Ich würde nur für private Mitglieder, die keine Zeichenfolgen sind und in keiner Eigenschaft oder Methode direkt zurückgegeben werden, nach Synchronisierung suchen.

+0

Übrigens sind Strings unveränderlich, aber die CLR erzeugt auch nie mehr als eine Literalkonstante mit dem gleichen Wert, zB: 'const string l1 = "lock"; 'und' const string l2 = "lock"; 'kann einen auslösen, wenn' l1' und 'l2' beide in einer lock -Anweisung verwendet werden. –

+1

Und Strings können sogar zwischen AppDomains geteilt werden, was die Chance erhöht auf Deadlocks noch weiter. – Steven

+0

Schön, Steven ... scheint, als wäre die "Lock" -Funktion von .Net auf eine neuere Art und Weise gestaltet worden (im Nachhinein betrachtet). Ich hoffe, andere werden auf gefährlichere Gebräuche hinweisen. –