2012-07-02 5 views
13

Zugriffsmodifizierer wie public, private sind für statische Konstruktoren in C# nicht zulässig. Die Visual Studio-Codeanalyse enthält jedoch eine Warnung in der C# -Sicherheitskategorie "CA2121: Static constructors should be private".Wie können statische Konstruktoren nicht privat gemacht werden?

Ist es möglich, einen statischen Konstruktor nicht privat zu machen? Oder ist das ein Fehler bei der Analyse von Visual Studio-Code?

CLARIFICATION: Ich versuche nicht, irgendeinen Konstruktor nicht privat zu machen. Warum also?" Fragen sind irrelevant. Ich bin nur neugierig auf den Widerspruch zwischen zwei Microsoft-Tools und möchte sehen, ob es etwas gibt, was ich nicht weiß, wie statische Konstruktoren behandelt werden.

+0

Ein Zitat aus dem obigen Link: 'Der Benutzer hat keine Kontrolle darüber, wann der statische Konstruktor aufgerufen wird. Wenn ein statischer Konstruktor nicht privat ist, kann er durch einen anderen Code als das System aufgerufen werden. Abhängig von den Operationen, die im Konstruktor ausgeführt werden, kann dies zu unerwartetem Verhalten führen. " – Tisho

+1

Ich denke, das relevante Zitat lautet" Diese Regel wird von den C# - und Visual Basic .NET-Compilern erzwungen. " Also, nein, in C# kann man es nicht privat machen. – Henrik

Antwort

9

Ein statischer C# -Konstruktor ist immer privat. Sie sollten diese Warnung für C# -Code nie sehen, und die Warnung ist dort nicht nützlich. Die Codeanalyse ist jedoch auch für andere Sprachen verfügbar, und diese anderen Sprachen können dazu führen, dass Sie Klassen mit nicht privaten statischen Konstruktoren schreiben.

+0

Warum wird dann für C# angegeben? Denkst du, das ist der Fehler? –

+0

@ssg Wo steht das? – hvd

+0

@ssg Wenn Sie auf "Diese Regel wird von den Compilern C# und Visual Basic .NET erzwungen werden."Im Kommentar zu Ihrer Frage erwähnt, dann nein, das bedeutet, dass der Compiler bereits sicherstellt, dass statische Konstruktoren privat sind, was bedeutet, dass diese Warnung niemals ausgelöst werden sollte." – hvd

3

Wenn Sie die Dokumentation lesen es eindeutig

Wenn ein statischer Konstruktor nicht privat ist, kann es durch ein anderer Code als System aufgerufen werden. Abhängig von den Operationen, die im Konstruktor ausgeführt werden, kann dies zu unerwartetem Verhalten führen.

nehme ich die wichtigere Frage warum wäre möchten Sie wollen?

+0

Die Sache ist, ich kann nicht. Der Compiler gibt einen Fehler aus, wenn ich versuche, die statische Datei mit einem Zugriffsmodifizierer zu versehen. Vielleicht auf der IL-Ebene? –

+0

C# erlaubt nicht, dass der cctor nicht privat ist, siehe Hendriks Kommentar oben. – usr

+0

@ssg Ich würde mich fragen * warum * du brauchst es etwas anderes als 'privat'. Ich würde sicher sagen, dass Ihr Design wahrscheinlich eher falsch ist als das C# -Team einen Trick für die Verwendung von nicht privaten statischen Konstruktoren fehlt. – James

1

Ist es möglich, einen statischen Konstruktor nicht privat zu machen?

Was wäre der Sinn davon?

Ein statischer Konstruktor wird in dem Moment aufgerufen, in dem die Klasse vom Linker geladen wird, bevor eine Methode ausgeführt wird. Daher könnte ein statischer Konstruktor nicht sinnvoll außerhalb des automatischen Aufrufs vom Linker aufgerufen werden, was bedeutet, dass es keinen Sinn hat, einen Zugriffsmodifikator zu haben.

Grundsätzlich können Sie keine Klasse ohne die STATIC MODIFIER EXECUTING referenzieren - und zwar bevor Ihr Code, der die Referenz enthält, ausgeführt wird.